1

rpy2を介してユーザー定義関数から(lmtestパッケージから)lrtestを呼び出した場合にのみ発生するエラーがあります。

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

トラブルシューティング:

  • Rでコードをテストしましたが、すべて正常に動作します。
  • Pythonからrpy2を介してRにデータフレームを渡し、R関数からis.data.frame(dat)を呼び出しましたが、trueが返されるため、問題はlmtestまたはlrtest+rpy2にあります。

どんな助けでも素晴らしいでしょう。皆さんありがとう!

4

2 に答える 2

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)
于 2012-09-23T19:12:07.190 に答える
0

答えが見つかりました

問題は、モデルを更新するための lrtest の内部呼び出しでした。lrtest に入ると、dat は範囲外でした。モデルを手動で更新し、lrtest の代替呼び出し lrtest(model0,model1) を使用することで、この問題は完全に回避されます。

信じられないほど迅速に返信してくれた Achim Zeileis に感謝します。

于 2012-09-23T22:52:44.390 に答える