我正在开发一个自定义 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 等,但这也给了我错误。命名这些预测函数以避免手动加载库的正确方法是什么?
我自己有时也遇到过这种情况,例如,这有效:
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()调度得很好。