RPy2 导入 R 源函数时出错

1 投票
1 回答
1873 浏览
提问于 2025-04-28 00:12

如标题所示,我有一个Python脚本,它使用Rpy2并导入一个R文件。

R文件的内容(命名为r_code.R):

test_function <- function(A)
{
    A <- as.vector(A)
    return(list(SUM=sum(A)))
}

Python文件的内容(命名为rpy2_test.py):

import numpy as np
import rpy2.robjects as robjects
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()

robjects.r('''source('r_code.R')''')

r_test_function = robjects.globalenv['test_function']

def py_test_function(a):
    mc = r_test_function(a)
    return mc[0]

a = np.array([1,2,3,4,5])
mc = py_test_function(a)
print mc[0]

这两个文件在同一个文件夹里。我输入“python rpy2_test.py”,结果出现了这个错误:

错误信息:在readLines(file, warn = FALSE)中出错: 传递了5个参数给.Internal(readLines),但它需要6个参数 追踪信息(最近的调用在最前面): 文件 "rpy2_test.py",第7行,出错 robjects.r('''source('r_code.R')''') 文件 "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/__init__.py",第246行,在call中

res = self.eval(p) 文件 "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py",第166行,在call中

return super(SignatureTranslatedFunction, self).call(*args, **kwargs) 文件 "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py",第99行,在call中

res = super(Function, self).call(*new_args, **new_kwargs) rpy2.rinterface.RRuntimeError: 在readLines(file, warn = FALSE)中出错:

传递了5个参数给.Internal(readLines),但它需要6个参数

有趣的是,这个脚本之前运行得很好,我没有改动任何东西(至少我觉得没有)在我的系统上。

Python版本:2.7.3

Numpy版本:1.8.0

Rpy2版本:2.4.4

R版本:3.0.2

Ubuntu版本:12.04.2

有什么想法吗?谢谢!

暂无标签

1 个回答

4

好吧,经过几个小时的折腾。

我之前自己编译过R,这次虽然编译和安装都没问题,但在构建一些库的时候却出错了(这些错误会在rpy2中出现)。所以我尽量卸载、清理、删除了所有的R文件。还用apt-get --purge remove命令来确保删除了旧的安装版本。

我确认我的apt-get sources.list文件里有一个有效的cran镜像,然后执行了apt-get update。

接着用apt-get install r-base把所有需要的东西都装回来了。

然后又执行了pip install rpy2 --upgrade(尽管我试着卸载它,但它还是像鞋子上的狗屎一样死死粘着我,这让我无法进行全新安装)。

回到正题。我真搞不懂为什么我的rpy2桥接突然不工作了。

这个问题似乎没有太多人关注,所以我决定接受自己的回答并关闭它。也许将来能帮到某个人。

@cdeterman:也许是R的版本问题……谁知道呢!(不过,还是要给你点赞,最好的建议)

更新:我有种感觉,可能是ubuntu的更新干扰了我的源安装。我很想知道有没有其他人遇到过类似的冲突。

撰写回答