Cool, I will try the new source. Thanks a lot!
Hao > > 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