Как вызвать прогнозирование для 3 разных алгоритмов из одной и той же пользовательской функции пакета R?
Я работаю над заказным R-пакетом (он приватный, нигде не размещен). В этом пакете у меня есть функция, которая берет модели xgboost, RandomForest (из функции рейнджера) и glmnet и использует их для прогнозирования нового набора данных.
Каждый раз, когда я предсказываю, я использую одну и ту же обобщенную функцию предсказания. Если я не использую пространство имен для функции, R не знает, какую библиотеку использовать для предсказания.
Я получаю ошибку:
Error in UseMethod("predict") :
no applicable method for 'predict' applied to an object of class "c('lognet', 'glmnet')"
Если я загружаю функции вручную, это работает, но я знаю, что загрузка пакетов вручную в библиотеке R является табу.
Я пытался использовать glmnet::glmnet.predict и т. Д., Но это также дает мне ошибки. Каков был бы правильный способ для пространства имен этих функций предсказания, чтобы избежать загрузки библиотек вручную?
0 ответов
Я сам сталкивался с этим иногда, когда, например, это работает:
ranger::predictions(predict(model, data))
но это не при идентичных обстоятельствах:
predict(model, data)
Ваша посылка предположительно Import
s необходимая зависимость, но различные методы S3, включая predict.<class>()
, никогда не регистрируются для использования, если вы не скажете R использовать их в какой-то момент раньше в вашей программе. Вы можете исправить это, добавивrequireNamespace(<package name>, quietly = TRUE)
либо вверху данной функции, либо в .onLoad()
. Это заставляет R регистрировать соответствующие методы S3 и т. Д., И вы можете подтвердить это, установив флажокmethods(predict)
до и после. Важно отметить, что это верно для неэкспортируемых методов, которые не позволяют roxygen2 декларации как#' @importFrom <package name> <predict.class>
.
В моем конкретном примере выше ::
заставляет R загружаться ranger
наряду с его различными методами S3, включая predict.ranger()
, так predict()
отправляет просто отлично.