只有当我通过rpy2从用户定义的函数调用lrtest(来自lmtest包)时才会出现错误。
R:
continuous.test <- function(dat) {
require('lmtest')
options(warn=-1)
model <- lm(formula='pheno ~ .', data=dat)
anova <- lrtest(model,'interaction')
pval <- anova$"Pr(>Chisq)"[2]
}
当我从R解释器调用此函数时,一切都正常运行。但是,从以下python代码片段调用时收到错误。注意,这个特殊的python文件会成功地对rpy2进行许多其他调用。
的Python:
...
kway_dat = R.DataFrame(dataframe) # this is a valid dataframe, it's used in other calls.
...
R.r("source('/path/to/user/defined/file/perm_test.r')")
continuous_test = R.r['continuous.test']
pval = continuous_test(kway_dat)
错误:
Error in is.data.frame(data) : object 'dat' not found
Traceback (most recent call last):
File "./test_r_.py", line 83, in <module>
pval = continuous_test(kway_dat)
File "/usr/lib/python2.6/site-packages/rpy2-2.2.6dev_20120806-py2.6-linux-x86_64.egg/rpy2/robjects/functions.py", line 82, in __call__
return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/rpy2-2.2.6dev_20120806-py2.6-linux-x86_64.egg/rpy2/robjects/functions.py", line 34, in __call__
res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Error in is.data.frame(data) : object 'dat' not found
故障排除:
任何帮助都会很棒。谢谢大家!
答案 0 :(得分:1)
提供一个自包含的示例会更容易(因此可以准确再现您正在经历的内容)。
可能的答案仍然是:您可能想要检查文件的内容
/path/to/user/defined/file/perm_test.r
真的是你的想法。
我还为一个自包含的示例添加了一个存根:
r_code = """
require('lmtest')
options(warn=-1)
continuous.test <- function(dat) {
model <- lm(formula='pheno ~ .', data=dat)
anova <- lmtest::lrtest(model,'interaction')
pval <- anova$"Pr(>Chisq)"[2]
}
"""
from rpy2.robjects import packages
my_r_pack = packages.SignatureTranslatedAnonymousPackage(r_code, "my_r_pack")
# [build a demo kway_dat here]
my_r_pack.continuous_test(kway_dat)
答案 1 :(得分:0)
找到答案
问题是lrtest内部调用更新模型。一旦进入lrtest,dat就超出了范围。通过手动更新模型并使用lrtest的替代调用lrtest(model0,model1),完全避免了问题。
感谢Achim Zeileis非常及时地回复。