[R] Sweave and the "[" function

Ross Darnell r.darnell at uq.edu.au
Tue Sep 5 12:56:33 CEST 2006


Hi Vincent

This would seem logical but in this case doesn't work.
It doesn't seem to be a Sweave problem (feature) at all  but within R as 
Hadley stated.
Within R try

 > quote(women[1])
women[1]

now try

 > quote("["(women,1))
women[1]

So it's parsed and "normalised" (there's a familiar term); in this case 
to women[1] before its quoted.

Curiously in the "R Language Definition Guide" in 10.4.3  it states

R has three indexing constructs, two of which are syntactically similar 
although with somewhat
different semantics:
object [ arg1, ...... , argn ]
object [[ arg1, ...... , argn ]]
The object can formally be any valid expression, but it is understood to 
denote or evaluate
to a subsettable object. The arguments generally evaluate to numerical 
or character indices,
but other kinds of arguments are possible (notably drop = FALSE).
Internally, these index constructs are stored as function calls with 
function name "[" respectively
"[[".

So I'm lost now. Can some one hand me a  map and compass?
 




Vincent Goulet wrote:
> Le Mardi 5 Septembre 2006 0:03, hadley wickham a écrit :
>   
>>> <<>>=
>>> str(women)
>>> women$height
>>> women[,1]
>>> "["(women,1)
>>> @
>>>
>>> to show the equivalence of  three methods of extracting an element from
>>> a data.frame.
>>>
>>> However Sweave returns the last of these as
>>>
>>> women[1]
>>>
>>> in the S input chunk
>>>
>>> How can I force it not to do this and return "["(women,1)
>>>       
>> I don't think you can.  Sweave parses your R code and from then on
>> uses the internal R representation.  R normalises the parse tree in
>> certain ways (eg. strips comments, formats source code, and clearly
>> normalises some function calls).  Since sweave uses this, and not the
>> original text, I don't think there is anyway to get around this,
>> unless there is some trick during parsing.
>>
>> (And don't forget women[[1]])
>>
>> Hadley
>>     
>
> So here's a workaround (untested):
>
> <<echo=TRUE, eval=TRUE>>=
> str(women)
> women$height
> women[,1]
> @
> <<echo=TRUE, eval=FALSE>>=
> "["(women,1)
> @
> <<echo=FALSE, eval=TRUE>>=
> "["(women,1)
> @
>
> I often end up doing similar things.
>
> HTH    Vincent
>
>



More information about the R-help mailing list