【问题标题】:How to pass a list to R in rpy2 and get result back如何在rpy2中将列表传递给R并返回结果
【发布时间】:2014-08-12 16:40:25
【问题描述】:

我是第一次尝试使用 rpy2。假设我在 python 中有一个列表

l = [1,2,3,4,5,6]

我想在 R 中调用

ks.test(l, pexp)

我该怎么做?

我最初的尝试是

#!/usr/bin/python
import rpy2.robjects as robjects

l = [1,2,3,4,5]

f = robjects.r('''
f<-function(l){
    ks.test(l, pexp)
}''')
print f(l)

这显然不是我得到的正确方法

Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 
  'x' must be atomic
Traceback (most recent call last):
  File "./rpy2-test.py", line 12, in <module>
    print f(l)
  File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py", line 166, in __call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py", line 99, in __call__
    res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 
  'x' must be atomic

这样做的正确方法是什么?

【问题讨论】:

    标签: python r rpy2


    【解决方案1】:

    我认为您不能直接将 python 列表传递给 R。您可以在使用前转换为 R int 向量。

    #!/usr/bin/python
    import rpy2.robjects as robjects
    
    l = [1,2,3,4,5]
    
    # get ks.test via execute string as R statement
    test = robjects.r('ks.test')
    # get a built-in functions variables directly
    pexp = robjects.r.pexp
    
    l_vector = robjects.IntVector(l)
    result = test(l_vector, pexp)
    print result[result.names.index('p.value')]
    

    参考:

    【讨论】:

    • 非常感谢!有没有更紧凑的方式来调用 ks.test 而不必定义新函数 f?
    • @user2179021 我已经相应地重新审视了答案。
    • 再次感谢您。如果我只想要 p 值,我是否必须在 R 中提取它?我问,似乎 python 只是得到了一个字符串。
    • @user2179021 返回的值是 ListVector,而不是我期望的数据框。我不知道为什么。但是,您可以通过result[result.names.index('p.value')] 获取 p.value。
    • result[result.names.index('p.value')][0] 似乎是我想要的实际值。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多