Вызов R-функций из Python с использованием rpy2 - PullRequest
0 голосов
/ 08 ноября 2018

Я следовал инструкциям по работе с OOPS R в документации по rpy2 здесь: https://rpy2.readthedocs.io/en/version_2.8.x/robjects_oop.html. Я пытаюсь создать класс Python для вызова функции rfsrc в пакете R randomForestSRC.

При каких условиях это работает? Имеет ли 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 голосов
/ 08 ноября 2018

Есть несколько вопросов. Я выбрал тот, который может быть источником всех других.

Имеет ли rpy2 фиксированный список пакетов, к которым он позволяет получить доступ, и если да, то есть randomForestSRC в этом списке?

rpy2 может использовать только пакеты R, доступные в вашей установке R. В документации есть кое-что об установке пакетов R из Python (также обратите внимание на URL для документации по rpy2-2.9.x): https://rpy2.github.io/doc/v2.9.x/html/robjects_rpackages.html#installing-removing-r-packages

Edit:

Вопрос был отредактирован, чтобы теперь сосредоточиться на сообщении об ошибке no generic function found for 'rfsrc'. Ошибка исходит от R, потому что не найдена универсальная функция с именем "rfsrc".

Я думаю, что rfsrc - это обычная функция R (не универсальная, см. https://github.com/cran/randomForestSRC/blob/master/R/rfsrc.R). Кроме того, я не являюсь пакетом randomForest, использующим S4, и функции rpy2, которые вы пытаетесь использовать, специально разработаны для системы S4 OOP от R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...