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

From: Laurent Gautier <lgautier_at_gmail.com>
Date: Thu, 19 Nov 2009 11:16:32 +0100

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
>>
>

R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu 19 Nov 2009 - 10:20:16 GMT

This archive was generated by hypermail 2.2.0 : Thu 19 Nov 2009 - 10:50:30 GMT