使用rpy2从Python调用R函数

时间:2018-11-08 02:28:16

标签: python r oop rpy2

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

在什么条件下可以工作? rpy2是否有固定的软件包列表供您访问,如果是,则此列表上是否包含randomForestSRC?

当我从Jupyter Notebook(Python 3,R 3.5.1)运行下面的代码时,出现错误:(function(f,signature = character(),其中= 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)

1 个答案:

答案 0 :(得分: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系统设计的。