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

Reply via email to