Hi all,
I am trying to wrap adk.test from R package adk using rpy2 2.2.1 but I 
am running into problems with passing parameters to it. More 
specifically I get a runtime error in R:

> In [1]: %run ad.py
> Carico il pacchetto richiesto: adk
> Error in sort.list(unique(x)) :
>   'x' must be atomic for 'sort.list'
> Have you called 'sort' on a list?
> ---------------------------------------------------------------------------
> RRuntimeError                             Traceback (most recent call 
> last)
>
> /home/giovanni/repos/peers/ad.py in <module>()
>      20 if __name__ == '__main__':
>      21     r_adk = R_factory()
> ---> 22     r_adk(np.random.rand(100),np.random.rand(100))
>      23
>      24
>
> /home/giovanni/repos/peers/ad.py in r_adk(*args)
>      14         '''
>      15         args = map(Vector, map(list, args))
> ---> 16         return adk_test(*args)
>      17
>      18     return r_adk
>
> /usr/lib/python2.6/dist-packages/rpy2/robjects/functions.pyc in 
> __call__(self, *args, **kwargs)
>      81                 v = kwargs.pop(k)
>      82                 kwargs[r_k] = v
> ---> 83         return super(SignatureTranslatedFunction, 
> self).__call__(*args, **kwargs)
>      84
>      85
>
> /usr/lib/python2.6/dist-packages/rpy2/robjects/functions.pyc in 
> __call__(self, *args, **kwargs)
>      33         for k, v in kwargs.iteritems():
>      34             new_kwargs[k] = conversion.py2ri(v)
> ---> 35         res = super(Function, self).__call__(*new_args, 
> **new_kwargs)
>      36         res = conversion.ri2py(res)
>      37         return res
>
> RRuntimeError: Error in sort.list(unique(x)) :
>   'x' must be atomic for 'sort.list'
> Have you called 'sort' on a list?

What I do in Python is the following:


****************

''' Anderson-Darling k-samples test '''

import numpy as np

def R_factory():
     from rpy2.robjects import r, Vector
     require = r['require']
     require('adk')
     adk_test = r['adk.test']

     def r_adk(*args):
         '''
         R version from adk
         '''
         args = map(Vector, map(list, args))
         return adk_test(*args)

     return r_adk

if __name__ == '__main__':
     r_adk = R_factory()
     r_adk(np.random.rand(100),np.random.rand(100))

*************

The actual code of adk.test is:

> function (...)
> {
>     if (nargs() == 1 & is.list(list(...)[[1]])) {
>         samples <- list(...)[[1]]
>     }
>     else {
>         samples <- list(...)
>     }
>     k <- length(samples)
>     if (k < 2)
>         stop("Must have at least two samples.")
>     ns <- sapply(samples, length)
>     if (any(ns == 0))
>         stop("One or more samples have no observations.")
>     x <- NULL
>     for (i in 1:k) x <- c(x, samples[[i]])
>     n <- length(x)
>     Z.star <- sort(unique(x))

I also tried putting the Vectors in an R list and passing that to r_adk 
or redefining r_adk(a,b) instead of r_adk(*args) but doesn't seem to 
like both. I am not an R expert so forgive if it's a very silly question.

Best

G



------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today
http://p.sf.net/sfu/msIE9-sfdev2dev
_______________________________________________
rpy-list mailing list
rpy-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpy-list

Reply via email to