2013-03-22 80 views
6

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

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

我已经把this Gist作为一个小例子,其中突出了我的问题,包含以下R档:

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

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

回答

7

这里的主要问题是请注意未定义函数/方法predict。它为通用的predict提供了几种方法,但不是泛型本身。

您需要从统计导入通用包,如果你需要它 - 我不知道你这样做,你没有创建一个需要或建立在通用的功能。在最低限度,你需要

#' @importFrom stats predict 

虽然你可能需要/想导入整个统计命名空间 - 取决于你的包的确超出你目前正在使用的功能是什么。

的另一个问题是,predict.mvrPLS出口命名空间

> 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方法。

+1

或者,不要在描述代码中放入'pls',直接使用'pls ::: predict.mvr'(并确保'pls'至少在描述IMPORTS中以保证其安装)。 – Gregor 2016-05-26 18:14:32

+0

直接使用'pls ::: predict.mvr'并不好,三重冒号表明您在作者不想要的地方徘徊。 – 2016-09-02 15:55:17