From P.Dalgaard at biostat.ku.dk  Thu Nov 19 09:37:05 2009
From: P.Dalgaard at biostat.ku.dk (Peter Dalgaard)
Date: Thu, 19 Nov 2009 09:37:05 +0100
Subject: [Rd] Issue when calling deparse(substitute(x)) from C with
 "anonymous" R vectors ?
In-Reply-To: <4B04F65C.2040002@gmail.com>
References: <4B04F65C.2040002@gmail.com>
Message-ID: <4B0503B1.3050906@biostat.ku.dk>

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

It can be generated from R itself:

> x <- sample(0:1,2000,replace=T)
> y <- sample(0:1,2000,replace=T)
> eval(substitute(chisq.test(x,y),list(x=x,y=y)))
Error in names(dimnames(x)) <- DNAME :
  'names' attribute [252] must be the same length as the vector [2]

Looks like nlines=1 is needed in the deparse().

-- 
   O__  ---- Peter Dalgaard             ?ster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)              FAX: (+45) 35327907



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