我在使用rpy2库从python运行外部R脚本时遇到问题。环境和这个问题一样,但我觉得它不能解决我的问题。通过总结这个问题,我可以通过硬键入R函数来运行它,但不必调用包含它的脚本,因为我遇到了解析错误。
更具体地说,我有一个名为"produce_CI.R"的R脚本,其中包含以下代码
library(readr)
library(bnlearn)
perform_CI <- function(c1, c2, s, dataset, test_type){
print(c(c1,c2,s))
if (!s[1]=="()"){
t <- ci.test(c1, c2, c(s), data = dataset, test = test_type)
}else{
t <- ci.test(c1, c2, data = dataset, test = test_type, debug = TRUE)
}
print(t)
return <- t
}
我试着用这个代码从python调用它
import rpy2.robjects as robjects
import os
robjects.r("""source(%s)""" % os.path.join(os.getcwd(), 'produce_CI.r'))
这给了我以下解析错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "path/ci_venv/lib/python3.8/site-packages/rpy2/robjects/__init__.py", line 437, in __call__
p = rinterface.parse(string)
File "path/ci_venv/lib/python3.8/site-packages/rpy2/rinterface_lib/conversion.py", line 45, in _
cdata = function(*args, **kwargs)
File "path/ci_venv/lib/python3.8/site-packages/rpy2/rinterface.py", line 103, in parse
res = _rinterface._parse(robj.__sexp__._cdata, num, rmemory)
File "path/ci_venv/lib/python3.8/site-packages/rpy2/rinterface_lib/_rinterface_capi.py", line 652, in _parse
raise RParsingError('Parsing status not OK',
rpy2.rinterface_lib._rinterface_capi.RParsingError: Parsing status not OK - PARSING_STATUS.PARSE_ERROR
我能够运行代码的唯一方法是使用python 中的字符串对其进行硬编码
from rpy2.robjects.packages import SignatureTranslatedAnonymousPackage as STAP
r_code = '''library(readr)
library(bnlearn)
perform_CI <- function(c1, c2, s, dataset, test_type){
print(c(c1,c2,s))
if (!s[1]=="()"){
t <- ci.test(c1, c2, c(s), data = dataset, test = test_type)
}else{
t <- ci.test(c1, c2, data = dataset, test = test_type, debug = TRUE)
}
print(t)
return <- t
}
'''
testy = STAP(r_code, "testy")
# ====
# removed code to initialize t,x,z_vec, df_r and r_method
# ====
testy.perform_CI(t,x,z_vec, df_r, r_method)
我对这个解决方案不满意,因为我想直接调用R脚本中的代码,从那时起我就没有重复的代码了因此,我正在寻找这个解析错误的解决方案,而不是仅仅";使代码工作";。
我觉得一个问题可能是我在MacOS上编写代码,并在Ubuntu机器上运行,因此可能会出现行尾问题。因此,我尝试用python读取R代码,因为它是一个字符串,(显然(每次有新行时,我都会看到很多"\n"。
我使用python 3.8和rpy2版本3.4.5 运行此代码
行
robjects.r("""source(%s)""" % os.path.join(os.getcwd(), 'produce_CI.r'))
将产生类似CCD_ 1的字符串以被评估为R代码。缺少报价。