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@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel




--
Brian D. Ripley,                  rip...@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

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to