簡體   English   中英

是否可以在testthat測試或run_examples()中使用R包數據?

[英]Is it possible to use R package data in testthat tests or run_examples()?

我正在開發一個R包,使用devtools,testthat和roxygen2。 我在數據文件夾(foo.txt和bar.csv)中有幾個數據集。

我的文件結構如下所示:

/ mypackage
    / data
        * foo.txt, bar.csv
    / inst
        / tests
            * run-all.R, test_1.R
    / man
    / R

我很確定'foo'和'bar'是正確記錄的:

    #' Foo data
    #'
    #' Sample foo data
    #'
    #' @name foo
    #' @docType data
    NULL
    #' Bar data
    #'
    #' Sample bar data
    #'
    #' @name bar
    #' @docType data
    NULL

我想在我的文檔示例和單元測試中使用'foo'和'bar'中的數據。

例如,我想通過調用以下方法在我的測試中使用這些數據集:

    data(foo)
    data(bar)
    expect_that(foo$col[1], equals(bar$col[1]))

而且,我希望文檔中的示例如下所示:

    #' @examples
    #' data(foo)
    #' functionThatUsesFoo(foo)

如果我在開發包時嘗試調用data(foo),我會收到錯誤“data set'foo'not found”。 但是,如果我構建軟件包,安裝它並加載它 - 那么我可以使測試和示例工作。

我目前的解決方法是不運行示例:

    #' @examples
    #' \dontrun{data(foo)}
    #' \dontrun{functionThatUsesFoo(foo)}

在測試中,使用特定於本地計算機的路徑預加載數據:

    foo <- read.delim(pathToFoo, sep="\t", fill = TRUE, comment.char="#")
    bar <- read.delim(pathToBar, sep=";", fill = TRUE, comment.char="#"
    expect_that(foo$col[1], equals(bar$col[1]))

這似乎並不理想 - 特別是因為我正在與其他人合作 - 要求所有合作者擁有與'foo'和'bar'相同的完整路徑。 此外,文檔中的示例看起來無法運行,即使安裝了軟件包,它們也可以。

有什么建議? 非常感謝。

在examples / tests中導入非RData文件

我通過查看JSONIO軟件包找到了解決這個問題的方法 ,顯然需要提供一些除.RData類型之外的文件讀取示例。

testthat::test_package()在函數級示例中工作,並滿足R CMD check mypackage以及testthat::test_package()

(1)重新組織您的包結構,以便示例數據目錄在inst 在某些時候, R CMD check mypackage告訴我將非inst/extdata數據文件移動到inst/extdata ,所以在這個新結構中,它也被重命名。

/ mypackage
    / inst
        / tests
            * run-all.R, test_1.R
        / extdata
            * foo.txt, bar.csv
    / man
    / R
    / tests
        * run-testthat-mypackage.R

(2)(可選)添加頂級tests目錄,以便在R CMD check mypackage期間現在也運行新的測試測試。

run-testthat-mypackage.R腳本至少應該包含以下兩行:

library("testthat")
test_package("mypackage")

請注意,這是允許在R CMD check mypackage期間調用testt的部分,否則不是必需的。 您還應該在DESCRIPTION文件中添加testthat作為“Suggests:”依賴項。

(3)最后,用於指定包內路徑的秘訣:

barfile <- system.file("extdata", "bar.csv", package="mypackage")
bar <- read.csv(barfile)
# remainder of example/test code here...

如果查看system.file()命令的輸出,它將返回R框架內包的完整系統路徑。 在Mac OS X上,它看起來像:

"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/mypackage/extdata/bar.csv"

這對我來說似乎沒問題的原因是你沒有對包中的任何路徑功能進行硬編碼,因此這種方法相對於其他系統上的其他R安裝應該是健壯的。

data()方法

至於data()語義,據我所知,這是特定於頂級data目錄中的R二進制( .RData )文件。 因此,您可以通過預先導入數據文件並使用save()命令將它們save()到數據目錄中來繞過上面的示例。 但是,這假設您只需要顯示已將數據加載到R中的示例,而不是可重復地演示導入文件的上游過程。

Per @ hadley的評論, .RData轉換效果很好。

至於團隊成員之間不同環境的團隊協作的更廣泛問題,一個共同的模式是就單個環境變量達成一致,例如FOO_PROJECT_ROOT ,團隊中的每個人都將在他們的環境中適當地設置。 從那時起,您可以使用相對路徑,包括跨項目。

特定於R的方法是就每個團隊成員將在其.Rprofile文件中設置的一些數據/功能達成一致。 例如, devtools如何在非標准位置找到包。

最后但並非最不重要的是,雖然它不是最佳的,但您實際上可以將特定於開發人員的代碼放入存儲庫中。 如果@hadley這樣做,那不是一件壞事。 見,例如,他是如何激活某些行為testthat在自己的環境中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM