This will not work. Since the problem was fixed in the R source, what about just using it ?
# --- import urllib page = urllib.urlopen("https://svn.r-project.org/R/branches/R-2-10-branch/src/library/stats/R/chisq.test.R") code = page.readlines() chisq_test = ro.r(code) # this will now work # ( although not the most efficient way if larger vectors and/or a # a large number of tests are made because of deparse(substitute()) ) chisq_test(ro.FloatVector(range(100)), ro.FloatVector(range(100))) L. Hao Fan wrote: > Hi, Laurent and list, > > Thanks a lot for all the informations! I read through your > discussions at > https://stat.ethz.ch/pipermail/r-devel/2009-November/055701.html So it > is a R problem not rpy. :-) > I tried to work around this problem using the following code: > ----------------------------------------------------------- > import rpy2.robjects as robjects > import math > > p1dist = robjects.r.c() > p2dist = robjects.r.c() > > num = 30 > for i in range(num): > p1dist = robjects.r.c(p1dist, i) > p2dist = robjects.r.c(p2dist, i+1) > > res = robjects.r['chisq.test'](p1dist, p2dist) > print(str(res.r['p.value']).split()[-1]) > ---------------------------------------------------------- > > It works well. However if the input values are not integer but float, it > gives similar errors. > ------------------------------------------------------------- > import rpy2.robjects as robjects > import math > > p1dist = robjects.r.c() > p2dist = robjects.r.c() > > num = 30 > for i in range(num): > tmp1 = i * 0.1 + 0.01 > tmp2 = i * 0.1 + 0.05 > p1dist = robjects.r.c(p1dist, tmp1) > p2dist = robjects.r.c(p2dist, tmp2) > > res = robjects.r['chisq.test'](p1dist, p2dist) > print(str(res.r['p.value']).split()[-1]) > ------------------------------------------------------- > File "/usr/lib64/python2.6/site-packages/rpy2/robjects/__init__.py", > line 422, in __call__ > res = super(RFunction, self).__call__(*new_args, **new_kwargs) > rinterface.RRuntimeError: Error in names(dimnames(x)) <- DNAME : > 'names' attribute [6] must be the same length as the vector [2] > > I would like to try what you suggested - bind the values to a symbol in > an environment. Could you please point me to an example? I didn't find > such a case in the R or rpy manual. > (there is sth like the follows, but I tried sth similar and not work) > >>>> robjects.r('pi') + 2 > c(3.14159265358979, 2) >>>> robjects.r('pi')[0] + 2 > 5.1415926535897931 > > Thanks! > > > Hao > >> This is odd. >> When looking at what is happening, the problem is likely rooted in >> the use of deparse(substitute(x)) and deparse(substitute(y)) in the code >> for chisq.test. >> >> This is what is happening: >> >> >>> 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)',) >> >>> 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', ')') >> >> deparse(substitute()) starts splitting the output into several elements. >> >> R allows the use of anonymous objects, but when created at the C level >> some functions appear to break. I am currently seeing this as a >> potential problem with R. >> >> One workaround is to bind your objects to a symbol in a given >> environment, and call the chisq.test on them. >> Not so elegant, but I do not think of an other temporary solution. >> >> >> L. >> >> >> >> Hao Fan wrote: >>> Hi, List and Laurent, >>> >>> For the chisq function I tried to used through rpy2, I just did >>> more test with the exact code as follows: >>> ---------------------------------------------- >>> import rpy2.robjects as robjects >>> >>> p1dist = [] >>> p2dist = [] >>> num = 17 >>> for x in range(num): >>> p1dist.append(x) >>> p2dist.append(x-1) >>> >>> print p1dist >>> print p2dist >>> rp1dist = robjects.FloatVector(p1dist) >>> rp2dist = robjects.FloatVector(p2dist) >>> >>> res = robjects.r['chisq.test'](rp1dist, rp2dist) >>> print(str(res.r['p.value']).split()[-1]) >>> ----------------------------------------------------- >>> >>> When I set num to 17, it works >>> "Warning message: In function (x, y = NULL, correct = TRUE, p = >>> rep(1/length(x), length(x)), : >>> Chi-squared approximation may be incorrect >>> 0.2350833" >>> >>> However, if I set num to 18 (add one more element to the two vectors >>> to be compared by chisq.test), it doesn't work. >>> The error message is similar to my previous post: >>> File "/usr/lib64/python2.6/site-packages/rpy2/robjects/__init__.py", >>> line 422, in __call__ >>> res = super(RFunction, self).__call__(*new_args, **new_kwargs) >>> rinterface.RRuntimeError: Error in names(dimnames(x)) <- DNAME : >>> 'names' attribute [4] must be the same length as the vector [2] >>> >>> Could this mean that rpy2 doesn't take a long vector or I made some >>> stupid mistake? >>> >>> Thanks! >>> >>> >>> Hao >>>> Hi Hao, >>>> >>>> The exact example that triggers the error may matter. >>>> >>>> I just tried the following with rpy2-2.1dev and it worked. >>>> >>>> x = robjects.FloatVector((1,2,3)) >>>> y = robjects.FloatVector((2,3,4)) >>>> >>>> res = robjects.r['chisq.test'](x, y) >>>> >>>> I only get the following >>>> Warning message: >>>> In function (x, y = NULL, correct = TRUE, p = rep(1/length(x), >>>> length(x)), : >>>> Chi-squared approximation may be incorrect >>>> >>>> L. >>>> >>>> >>>> >>>> Hao Fan wrote: >>>>> Hi, list >>>>> >>>>> I would like to calculate the fitness of two histograms, so I >>>>> tried to use the chisq.test() in R through rpy2. >>>>> The python code I have is as follows: >>>>> ------------------- >>>>> import rpy2.robjects as robjects >>>>> >>>>> p1dist = [X1, X2, ... Xm] >>>>> p2dist = [Y1, Y2, ... Ym] >>>>> >>>>> rp1dist = robjects.FloatVector(p1dist) >>>>> rp2dist = robjects.FloatVector(p2dist) >>>>> >>>>> robjects.r['chisq.test'](rp1dist, rp2dist) >>>>> ------------------- >>>>> >>>>> Then I got the following error: >>>>> File >>>>> "/usr/lib64/python2.6/site-packages/rpy2/robjects/__init__.py", in >>>>> __call__ >>>>> res = super(RFunction, self).__call__(*new_args, **new_kwargs) >>>>> rinterface.RRuntimeError: Error in names(dimnames(x)) <- DNAME : >>>>> 'names' attribute [62] must be the same length as the vector [2] >>>>> >>>>> >>>>> I also tried rpy_classic, so my code change to the follows: >>>>> -------------------- >>>>> import rpy2.robjects as robjects >>>>> import rpy2.rpy_classic as rpy >>>>> rpy.set_default_mode(rpy.NO_CONVERSION) >>>>> >>>>> p1dist = [X1, X2, ... Xm] >>>>> p2dist = [Y1, Y2, ... Ym] >>>>> >>>>> rp1dist = robjects.FloatVector(p1dist) >>>>> rp2dist = robjects.FloatVector(p2dist) >>>>> >>>>> robjects.r['chisq.test'](rp1dist, rp2dist) >>>>> ----------------- >>>>> >>>>> Then I got similar error: >>>>> File "/usr/lib64/python2.6/site-packages/rpy2/rpy_classic.py", line >>>>> 214, in __call__ >>>>> res = self.__sexp(*args_r, **kwargs_r) >>>>> rinterface.RRuntimeError: Error in names(dimnames(x)) <- DNAME : >>>>> 'names' attribute [62] must be the same length as the vector [2] >>>>> >>>>> >>>>> I feel this problem is due to my wrong use of the R vector, but >>>>> I can not find it. Any hints will be mostly appreciated! >>>>> Thanks a lot in advance! >>>>> >>>>> >>>>> Hao >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>> >>> > > ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ rpy-list mailing list rpy-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rpy-list