2012-01-16 54 views
5

我由誤差- [R使用模擬的S3和S4的方法在同一個包

found an S4 version of 'simulate' so it has not been imported correctly 

我寫的R包,其中包括用於模擬()方法作爲S3方法的定義很困惑。由於仿真通用已經定義,我只需定義一個simulate.myclass(在我的情況下爲simulate.fitContinuous)。

該軟件包還取決於另一個具有S4版本模擬的軟件包。加載我的軟件包時,出現上面的S4版本錯誤。我不確定是什麼導致了錯誤。

重複的例子,通過抓住package from github,或做

require(devtools) 
install_github("pmc", "cboettig") 
require(pmc) 

從頭再現此錯誤:創建一個新的包以最小的描述文件。包括DESCRIPTION imports:ouch。創建一個NAMESPACE並添加導入(ouch)和S3method(模擬,測試)。創建將R目錄,添加一個簡單的腳本[R(我已經包括roxygen文件,將產生我剛纔提到的命名空間,但是也可以不devtools/roxygen創造了這個錯誤):

#' simulate 
#' 
#' a test for s3/s4 conflicts 
#' @param object who cares? 
#' @param nsim guess. 
#' @param seed yup 
#' @param ... other parameters we will just ignore 
#' @return something 
#' @method simulate test 
#' @S3method simulate test 
#' @import ouch 
simulate.test <- function(object, nsim = 1, seed = NULL, ...){ 
    message("This test worked") 
} 

安裝該軟件包(如果你喜歡,首先使用devtools的文檔),然後你會得到錯誤信息。

到目前爲止,我的最佳解決方案是從NAMESPACE中消除S3method行,然後導出完整的函數simulate.test。這將通過檢查和安裝沒有警告,但顯然是一個劣質的解決方案。

一個不同的解決方案是有依賴以及進口,並正確記錄S3方法(如上所述)。然後一切按預期工作,但警告信息仍然存在。

+0

請注意,使用依賴而不是導入,並保持S3method(模擬,測試)行不會產生任何錯誤,但也不會產生正確的行爲。 – cboettig 2012-01-19 05:34:58

回答

4

simulate是S3通用在stats定義,因此按照「寫作R附加」第1.6.2(例子中是不明確的 - 有在base定義泛型例外)命名空間的文件應該有

importFrom(stats, simulate) 
S3method(simulate, fitContinuous) 

關於「發現了S4方法」的生意似乎反映當問題被發現 - 試圖S4方法添加到S3通用的,這是不可見的(在「它」我猜是指在通用simulate)。

+0

在我的命名空間中導入的「ouch」包使stats成爲s4方法,這給了我這個錯誤。嘗試showMethods(「模擬」)而不加載ouch,並且您被告知它不是s4方法。加載庫(ouch); showMethods(「模擬」)然後模擬現在是S4方法。不知道如何解決這個問題,s4錯誤信息仍然存在。 – cboettig 2012-01-16 21:59:30

+0

我的答案似乎不正確,我沒有立即的解決辦法;對於錯誤信息抱歉。我猜測一個解決方法是選擇性地importFrom(而不是導入模擬),或者在模擬中定義一個S4方法,但這些都不是必需的,IMO。 – 2012-01-16 22:26:09

+0

嗯。 ouch軟件包已經定義了一個模擬s4方法。我需要使用該軟件包的模擬方法,因此導入它不是一個選項... – cboettig 2012-01-16 23:36:53

相關問題