是否可以在testthat测试或run_examples()中使用R包数据?

lde*_*cco 31 r devtools roxygen roxygen2

我正在开发一个R包,使用devtools,testthat和roxygen2.我在数据文件夹(foo.txt和bar.csv)中有几个数据集.

我的文件结构如下所示:

/ mypackage
    / data
        * foo.txt, bar.csv
    / inst
        / tests
            * run-all.R, test_1.R
    / man
    / R
Run Code Online (Sandbox Code Playgroud)

我很确定'foo'和'bar'是正确记录的:

    #' Foo data
    #'
    #' Sample foo data
    #'
    #' @name foo
    #' @docType data
    NULL
    #' Bar data
    #'
    #' Sample bar data
    #'
    #' @name bar
    #' @docType data
    NULL
Run Code Online (Sandbox Code Playgroud)

我想在我的文档示例和单元测试中使用'foo'和'bar'中的数据.

例如,我想通过调用以下方法在我的测试中使用这些数据集:

    data(foo)
    data(bar)
    expect_that(foo$col[1], equals(bar$col[1]))
Run Code Online (Sandbox Code Playgroud)

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

    #' @examples
    #' data(foo)
    #' functionThatUsesFoo(foo)
Run Code Online (Sandbox Code Playgroud)

如果我在开发包时尝试调用data(foo),我会收到错误"data set'foo'not found".但是,如果我构建软件包,安装它并加载它 - 那么我可以使测试和示例工作.

我目前的解决方法是不运行示例:

    #' @examples
    #' \dontrun{data(foo)}
    #' \dontrun{functionThatUsesFoo(foo)}
Run Code Online (Sandbox Code Playgroud)

在测试中,使用特定于本地计算机的路径预加载数据:

    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]))
Run Code Online (Sandbox Code Playgroud)

这似乎并不理想 - 特别是因为我正在与其他人合作 - 要求所有合作者拥有与'foo'和'bar'相同的完整路径.此外,文档中的示例看起来无法运行,即使安装了软件包,它们也可以.

有什么建议?非常感谢.

Pau*_*die 19

在examples/tests中导入非RData文件

我通过查看JSONIO软件包找到了解决这个问题的方法,显然需要提供一些除.RData类型之外的文件读取示例.

我得到这个在功能级别的示例工作,同时满足R CMD check mypackagetestthat::test_package().

(1)重新组织您的包结构,以便示例数据目录在其中inst.在某些时候R CMD check mypackage告诉我将非RData数据文件移动到inst/extdata,所以在这个新结构中,也重命名.

/ mypackage
    / inst
        / tests
            * run-all.R, test_1.R
        / extdata
            * foo.txt, bar.csv
    / man
    / R
    / tests
        * run-testthat-mypackage.R
Run Code Online (Sandbox Code Playgroud)

(2)(可选)添加顶级tests目录,以便您的新测试现在也在运行期间运行R CMD check mypackage.

run-testthat-mypackage.R脚本至少应包含以下两行:

library("testthat")
test_package("mypackage")
Run Code Online (Sandbox Code Playgroud)

请注意,这是允许在测试过程中进行测试的部分,R CMD check mypackage否则不是必需的.您还应该testthat在DESCRIPTION文件中添加"Suggests:"依赖项.

(3)最后,用于指定包内路径的秘诀:

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

如果查看system.file()命令的输出,它将在R框架内返回包的完整系统路径.在Mac OS X上,它看起来像:

"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/mypackage/extdata/bar.csv"
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎没问题的原因是你没有对包中的任何路径功能进行硬编码,因此这种方法相对于其他系统上的其他R安装应该是健壮的.

data() 途径

至于data()语义,据我所知,这是特定.RData于顶级data目录中的R binary()文件.因此,您可以通过预先导入数据文件并将save()命令保存到数据目录中来绕过上面的示例.但是,这假设您只需要显示已将数据加载到R中的示例,而不是可重复地演示导入文件的上游过程.