From ripley at stats.ox.ac.uk  Thu Nov 19 11:39:17 2009
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Thu, 19 Nov 2009 10:39:17 +0000 (GMT)
Subject: [Rd] Issue when calling deparse(substitute(x)) from C with
 "anonymous" R vectors ?
In-Reply-To: <4B051B00.5060206@gmail.com>
References: <4B04F65C.2040002@gmail.com>
	<alpine.OSX.1.00.0911190836300.72406@tystie.local>
	<4B051B00.5060206@gmail.com>
Message-ID: <alpine.LFD.2.00.0911191035580.10058@auk.stats.ox.ac.uk>

On Thu, 19 Nov 2009, Laurent Gautier wrote:

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

But '1:10' is probably what you do want.  Changiong the way R does 
things in general on the basis of a single example after ca 12 years 
would be unwise, not least because the user can change the way he 
calls the function to achieve this.

I've chosen simple not to name the dimensions if the deparse is too 
long.  The description (used by the print method) is trickier, and 
results in a long description.  Again, if you don't like it, change 
the call.

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

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



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