我正在开发一个自定义 R 包(它是私有(private)的,不在任何地方托管)。在这个包中,我有一个函数,它采用 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 等,但这也给了我错误。命名这些预测函数以避免手动加载库的正确方法是什么?
最佳答案
我自己也遇到过这种情况,例如,这有效:
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>
)的非导出方法是正确的。 .在我上面的特定示例中,
::
causes R to load ranger
以及它的各种 S3 方法,包括 predict.ranger()
, 所以 predict()
派送就好了。
关于r - 如何从相同的自定义 R 包函数调用 3 种不同算法的预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52526703/