从另一个包导入S3方法

seb*_*n-c 13 r package

我正在尝试predict从另一个包中导入S3方法pls.我有一个使用这些预测值的函数.问题是,在编译包时:

Error : object 'predict' is not exported by 'namespace:pls'
Run Code Online (Sandbox Code Playgroud)

我把这个Gist放在一起作为一个最小的例子,它突出了我的问题,并包含以下R文件:

#' Test function
#' 
#' @importFrom pls predict
#' 
#' @export

myfunc <- function(x){
  stopifnot(class(x) == "mvr")
  predict(x)*2
}
Run Code Online (Sandbox Code Playgroud)

Rei*_*son 12

总结一下,因为原件(下面)现在已经过时,并且在错误或误导的地方.

最近的问题是pls包中没有命名predict的函数; 有一些未出口的S3方法,但没有.所以你不能导入它.在一般生活中的统计数据包,就需要如下面讨论从那里进口.predictpredictpredict

你的包需要具有Depends: plsDESCRIPTION以正确的predict方法是提供给R.有没有在,你可以专门进口.

您还需要predictstats命名空间导入泛型,因此请添加

#' @importFrom stats predict
Run Code Online (Sandbox Code Playgroud)

因为这将导入您的包命名空间中的泛型.您还需要添加Imports: stats到您的DESCRIPTION文件中,以表明您需要stats包; 以前我们不必声明R附带的基本软件包集合的依赖关系(即R附带的非推荐的基础软件包).


原版的

这里的主要问题是pls没有定义函数/方法predict.它为predict泛型提供了几种方法,但不提供通用本身.

如果需要,您需要从stats包中导入泛型- 我不确定您是否这样做,因为您没有创建需要或基于泛型的函数.至少你需要

#' @importFrom stats predict
Run Code Online (Sandbox Code Playgroud)

虽然您可能需要/想要导入整个统计信息命名空间 - 取决于您的软件包在您当前正在处理的功能之外的功能.

另一个问题是,predict.mvr不是从出口PLS命名空间

> require(pls)
Loading required package: pls

Attaching package: ‘pls’

The following object(s) are masked from ‘package:stats’:

    loadings

> predict.mvr
Error: object 'predict.mvr' not found
> pls::predict.mvr
Error: 'predict.mvr' is not an exported object from 'namespace:pls'
> pls:::predict.mvr
function (object, newdata, ncomp = 1:object$ncomp, comps, type = c("response", 
    "scores"), na.action = na.pass, ...) 
Run Code Online (Sandbox Code Playgroud)

因此,您不能只导入它.因此,您的包需要有Depends: pls,DESCRIPTION以便predict找到正确的方法.

  • 或者不要将`pls`放在Description DEPENDS中,而是直接使用`pls:::predict.mvr`(并确保`pls`至少在Description IMPORTS中以保证其安装)。 (2认同)
  • 直接使用 `pls:::predict.mvr` 是不好的,三个冒号表明你在作者不希望你的地方闲逛。 (2认同)