从另一个包中导入S3方法

18

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

Error : object 'predict' is not exported by 'namespace:pls'

我已经制作了这个Gist,其中包含以下R文件,作为一个突出显示我的问题的最小示例:

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

myfunc <- function(x){
  stopifnot(class(x) == "mvr")
  predict(x)*2
}
1个回答

13
总结一下,原来的文档已经过时,在某些地方存在错误或误导。
问题在于pls包中没有名为predict的函数;虽然有些未导出的S3方法用于predict,但没有这样的predict。因此,你无法导入它。predict通用函数位于stats包中,你需要从那里导入,如下所述。
你的包需要在DESCRIPTION中具有以下内容:Depends: pls,以便正确的predict方法对R可用。在pls中没有任何可以特定导入的内容。
你还需要从stats名称空间导入predict通用函数,因此请添加:
#' @importFrom stats predict

这里的主要问题是,pls没有定义predict函数或方法。它提供了几种用于predict通用函数的方法,但没有提供通用函数本身。

如果你需要predict通用函数,你需要从stats包中导入它。但我不确定你是否需要它,因为你没有创建需要或基于通用函数构建的函数。至少你需要:

#' @importFrom stats predict

尽管您可能需要/想要导入整个stats名称空间 - 这取决于您的软件包在当前正在使用的函数之外执行的操作。

另一个问题是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, ...) 

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


2
或者,不要在描述DEPENDS中放置pls,直接使用pls:::predict.mvr(并确保至少在描述IMPORTS中包含pls以保证其安装)。 - Gregor Thomas
3
直接使用pls:::predict.mvr并不好,三个冒号表示你正在打听作者无意让你了解的内容。建议谨慎使用。 - Ken Williams
我刚刚通过将相关包放入Imports并在命名空间中添加importFrom("package", "method")来解决了类似的问题。 - papgeo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接