【问题标题】:Calling R functions from Python using rpy2使用 rpy2 从 Python 调用 R 函数
【发布时间】:2018-11-08 02:28:15
【问题描述】:

我一直在遵循 rpy2 文档中关于使用 R 的 OOPS 的说明:https://rpy2.readthedocs.io/en/version_2.8.x/robjects_oop.html。我正在尝试创建一个 Python 类来调用 R 包 randomForestSRC 中的函数 rfsrc。

这在什么条件下有效? rpy2 是否有一个固定的软件包列表,它允许您访问,如果有,那么 randomForestSRC 是否在此列表中?

当我从 Jupyter Notebook (Python 3, R 3.5.1) 运行以下代码时,我收到错误: (function (f, signature = character(), where = topenv(parent.frame() ), : 没有找到 'rfsrc' 的通用函数

import rpy2.robjects.packages as rpackages
from rpy2.robjects.vectors import StrVector

utils = rpackages.importr('utils')
utils.chooseCRANmirror(ind=1) # select the first mirror in the list
packnames = ('randomForestSRC', 'survival', 'tidyverse', 'magrittr', 'ggRandomForests', 'mlr')
utils.install_packages(StrVector(packnames))

from rpy2.robjects.packages import importr
randomForestSRC = importr('randomForestSRC')
from rpy2.robjects.methods import RS4Auto_Type
import six

class rfsrc(six.with_metaclass(RS4Auto_Type)):
    __rname__ = 'rfsrc'
    __rpackagename__ = 'randomForestSRC'

我还需要做什么才能使其正常工作?

我也尝试了如下所示的手动方法,得到了同样的错误。

import rpy2.robjects as robjects
import rpy2.rinterface as rinterface
from rpy2.robjects.packages import importr

lme4 = importr("randomForestSRC")
getmethod = robjects.baseenv.get("getMethod")

StrVector = robjects.StrVector

class rfsrc(robjects.methods.RS4):

    _coef = getmethod("rfsrc", 
                  signature = StrVector(["rfsrc", ]),
                  where = "package:randomForestSRC")

    def _call_get(self):
        return self.do_slot("call")
    def _call_set(self, value):
        return self.do_slot("call", value)
    call = property(_call_get, _call_set, None, "Get or set the RS4 slot      'call'.")

    def coef(self):
        """ fitted coefficients """
        return self._coef(self)

【问题讨论】:

    标签: python r oop rpy2


    【解决方案1】:

    有几个问题。我选择了可​​能是所有其他人的起源的那个。

    rpy2 是否有一个固定的软件包列表供您访问,如果有,randomForestSRC 是否在此列表中?

    rpy2 只能使用 R 安装中可用的 R 包。该文档有一些关于从 Python 安装 R 包的内容(另外,请注意 rpy2-2.9.x 文档的 URL):https://rpy2.github.io/doc/v2.9.x/html/robjects_rpackages.html#installing-removing-r-packages

    编辑:

    问题经过编辑,现在关注错误消息no generic function found for 'rfsrc'。错误来自 R,因为没有找到名为“rfsrc”的通用函数。

    我认为 rfsrc 只是一个常规的 R 函数(不是通用的,请参阅 https://github.com/cran/randomForestSRC/blob/master/R/rfsrc.R )。另外,我不是randomForest 的包使用S4 很多,而您尝试使用的rpy2 功能是专门为R 的S4 OOP 系统设计的。

    【讨论】:

    • 谢谢。我已经编辑了上面的代码以添加软件包的安装,但我仍然收到错误“get0 中的错误(cname,其中,继承 = 继承):无效的 'envir' 参数”。这些包已经安装在我的 R 副本中,并且我一直在使用 R 库调用加载它们,使用 R Magic 运算符 %%R。
    • 谢谢@lgautier。我再次编辑了这个问题,因为我现在使用两种方法都遇到了同样的错误:(函数(f,签名=字符(),其中= topenv(parent.frame())中的错误,:没有找到'rfsrc的通用函数'。所以我现在的主要问题是:这个错误是否意味着无法使用该方法调用包randomForestSRC中的函数rfsrc?
    • 作为现有答案的附录回答。
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多