[Rd] Issue when calling deparse(substitute(x)) from C with "anonymous" R vectors ?

Laurent Gautier lgautier at gmail.com
Thu Nov 19 11:16:32 CET 2009


Thanks to you and Peter for the quick answer.

I should definitely have tried I R. It just seemed to me so unlikely 
that no one ever reported that anonymous vectors would fail with 
chisq.test().

Having a label that would be x or y is along the lines of something I 
was thinking of, and this not only for chisq.test(). It would be helpful 
for functions such as plot() for example.

The idea would be to replace an anonymous object by its variable name, 
unless the anonymous variable is coming from a function call.

Example:

foo <- function(x) {
   xlabel <- deparse(substitute(x))
   # do things
}

foo(y) # xlabel is 'y'

foo(log(y)) # xlabel is 'log(y)'

foo(c(1,2,3)) # xlabel is 'x'

foo(log(c(1,2,3)) # xlabel is 'x'

This would likely require looking at the parse tree for the argument, 
and have a switch such as "if any leave is an anonymous object, use the 
parameter name".



L.








Prof Brian Ripley wrote:
> This is easy to reproduce in R:
> 
> chisq.test(c(1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 
> 1010, 1011),
> c(1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011))
> 
> The simple answer is: don't do that.
> 
> It is unclear what is a reasonable label to give in such a case: maybe 
> simply 'x' and 'y'?
> 
> On Thu, 19 Nov 2009, Laurent Gautier wrote:
> 
>> Dear list,
>>
>>
>> When calling R from C, what appears like a spurious error can be 
>> triggered during the execution of chisq.test(x, y).
>>
>> This is happening when the following conditions are met:
>>
>> - x and y are "anonymous" C-level R vectors (they do not have a symbol),
>> but they are protected from garbage collection
>>
>> - x and y are "not too small" (it was experienced as soon as they are 
>> longer than 17 elements).
>>
>>
>> The error is
>>
>> Error in names(dimnames(x)) <- DNAME :
>>  'names' attribute [4] must be the same length as the vector [2]
>>
>> and can be traced to the use of deparse(substitute(x)) and 
>> deparse(substitute(y)) in the R code.
>>
>> What seems to be happening is that the deparse(substitute(x)) call
>> gives a character vector of length > 1 as soon as x is "not so small".
>>
>> To demonstrate this, I am using rpy2 (as the problem was found when 
>> using it
>> http://sourceforge.net/mailarchive/forum.php?thread_name=4B043CA1.9050500%40salilab.org&forum_name=rpy-list 
>>
>> ), but it will likely be present in other bridges to R as well.
>>
>>
>> #using R-2.10 and rpy2-2.1.dev
>>>>> import rpy2.robjects as robjects
>>
>>>>> f = robjects.r('''function(x) return(deparse(substitute(x)))''')
>>
>>>>> tuple(f(robjects.FloatVector(range(17))))
>> ('c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)',)
>> # length 1
>>>>> tuple(f(robjects.FloatVector(range(18))))
>> ('c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17', ')')
>> # length 2 !!
>>
>>
>> Does it seem to others like an issue present in other bridges as well ?
>>
>>
>>
>> L.
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>



More information about the R-devel mailing list