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
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list