如何通过pyRserve调用名称中带点的R函数?

时间:2015-01-23 13:11:45

标签: python r rserve pyrserve

从python与Rserve会话交互时,pyRserve模块非常方便。

您可以通过其名称前缀来访问R对象,其表达式为“conn.r”或“conn.ref”

import pyRserve
import numpy
conn = pyRserve.connect()
conn.r.List = [1.1, 2.2, 3.3]
conn.r.sapply(conn.ref.List, conn.ref.sqrt)
Out[23]: array([ 1.04880885,  1.4832397 ,  1.81659021])

但如果函数名中有一个点

,这将不起作用
conn.r.sapply(conn.ref.List, conn.ref.as.integer)
    conn.r.sapply(conn.ref.List, conn.ref.as.integer)
                                           ^
SyntaxError: invalid syntax

我想出的唯一解决方案是将整个R表达式包装在一个字符串中 使用eval函数运行它:

conn.eval('result = as.integer(List)')
conn.r.result
Out[46]: array([1, 2, 3], dtype=int32)

有没有更有成效的方法呢?

注意:我在another SO thread中意识到类似的问题已经被问到rpy2模块的答案(另一个python R绑定)。

1 个答案:

答案 0 :(得分:0)

最后我找到了一个灵感来自thread的解决方案:

as_integer = getattr(conn.r, 'as.integer')
conn.r.sapply(conn.ref.List, as_integer)
Out[8]: array([1, 2, 3], dtype=int32)