2013-03-22 61 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