2009-12-10 78 views
4

所以我決定將我的幾個R函數放到一個包中,我正在閱讀/學習Writing R Extension發送包含單元測試的R包

它顯然抱怨我做得不對的事情。我在這裏發了幾個問題,這個是關於測試風格:我使用RUnit,我喜歡測試儘可能接近正在測試的代碼。這樣我就不會忘記測試,並將測試作爲技術文檔的一部分。

例如:

fillInTheBlanks <- function(S) { 
    ## NA in S are replaced with observed values 

    ## accepts a vector possibly holding NA values and returns a vector 
    ## where all observed values are carried forward and the first is 
    ## carried backward. cfr na.locf from zoo library. 
    L <- !is.na(S) 
    c(S[L][1], S[L])[1 + cumsum(L)] 
} 

test.fillInTheBlanks <- function() { 
    checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4)) 
    checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4)) 
    checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4)) 
} 

R CMD check問題音符線,像這樣的:

test.fillInTheBlanks: no visible global function definition for 
    ‘checkEquals’ 

,並抱怨我沒有記錄的測試功能。

我真的不想爲測試函數添加文檔,我絕對不想爲RUnit軟件包添加依賴項。

你覺得我應該看看這個問題?

回答

4

你在哪裏進行單元測試?您可能不想將它們放入R目錄。更標準的方法是把它們放在inst\unitTests之下。看看this R-wiki page regarding the configuration.

或者,您可以指定哪些文件將在NAMESPACE中導出,並且通過擴展來指定哪些函數應該也應該不被記錄。

除此之外,理想情況下,您應該在R CMD CHECK被調用時運行測試;這是設計的一部分。在這種情況下,您應該創建一個測試腳本,以在單獨的tests目錄中調用您的測試。你需要在這個腳本中加載RUnit包(但你不需要使它成爲你的包的依賴)。

編輯1:

關於你的失敗,因爲它無法找到checkEquals功能:我會改變你的功能是這樣的:

test.fillInTheBlanks <- function() { 
    require(RUnit) 
    checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4)) 
    checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4)) 
    checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4)) 
} 

這樣的包加載時該函數被調用,或者它會通知用戶該包是必需的。

編輯2:

"Writing R Extensions"

注意,在一個包中的所有用戶級對象應記錄;如果軟件包pkg包含僅供「內部」使用的用戶級對象,則它應提供文件pkg-internal。Rd記錄了所有這些對象,並明確指出這些並不意味着被用戶調用。見例如例如R分佈中的封裝網格的來源。請注意,廣泛使用內部對象的軟件包應將這些對象隱藏在名稱空間中,而不需要記錄它們(請參閱軟件包名稱空間)。

您可以使用pkg-internal.Rd文件作爲一個選項,但如果您打算使用多個隱藏對象,通常會在NAMESPACE中的聲明中處理。

+0

我把它們放在要測試的函數的定義下。將編輯問題以使自己清楚。 – mariotomo 2009-12-10 12:51:42

+0

我明白了。然後使用NAMESPACE文件,如果您不想記錄它們,則不要導出這些測試。除此之外,您可能需要在這些函數的頂部添加* require(RUnit)*,以便您不必顯式加載它。 – Shane 2009-12-10 12:55:44

+0

我把它們放在要測試函數的定義下(見編輯問題)。我會跟隨你的鏈接,看看我能做些什麼,謝謝。 – mariotomo 2009-12-10 12:56:18

1

您是否加載了包裝RUnit

最好的辦法可能是使用RUnit查看包含現有代碼的軟件包。

相關問題