如何从同一自定义 R 包函数中调用 3 种不同算法的预测?

mat*_*sho 5 r r-library

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

每次预测时,我都会使用相同的广义预测函数。如果我没有为函数命名空间,R 就不知道使用哪个库来进行预测。

我得到的错误是:

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

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

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

tom*_*fer 2

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

ranger::predictions(predict(model, data))
Run Code Online (Sandbox Code Playgroud)

但在相同的情况下,情况并非如此:

predict(model, data)
Run Code Online (Sandbox Code Playgroud)

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

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