RPy2 导入 R 源函数时出错
如标题所示,我有一个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 个回答
好吧,经过几个小时的折腾。
我之前自己编译过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的更新干扰了我的源安装。我很想知道有没有其他人遇到过类似的冲突。