4

我正在开发一个自定义 R 包(它是私有的,不在任何地方托管)。在这个包中,我有一个函数,它采用 xgboost、RandomForest(来自 ranger 函数)和 glmnet 模型,并使用它们在新数据集上进行预测。

每次我进行预测时,我都使用相同的广义预测函数。如果我不命名函数,R 不知道要使用哪个库进行预测。

我得到的错误是:

Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to an object of class "c('lognet', 'glmnet')" 

如果我手动加载函数,它可以工作,但我知道在 R 库中手动加载包是一个禁忌。

我尝试使用 glmnet::glmnet.predict 等,但这也给了我错误。命名这些预测函数以避免手动加载库的正确方法是什么?

4

1 回答 1

0

我自己也遇到过这种情况,例如,这有效:

ranger::predictions(predict(model, data))

但这在相同情况下不会:

predict(model, data)

您的包可能Import是必要的依赖项,但各种 S3 方法(包括predict.<class>())永远不会注册使用,除非您告诉 R 在程序早期的某个时间点使用它们。您可以通过requireNamespace(<package name>, quietly = TRUE)在给定函数的顶部或在.onLoad(). 这会导致 R 注册适当的 S3 方法等,您可以通过检查methods(predict)前后来确认这一点。重要的是,对于不允许roxygen2声明(如#' @importFrom <package name> <predict.class>.

在我上面的特定示例中,:: 导致 Rranger与其各种 S3 方法一起加载,包括predict.ranger(),所以predict()调度很好。

于 2020-07-26T20:46:00.087 回答