测试R包时,我能否访问外部文件?

3

我正在使用testthat包来测试一个在较大仓库中的R包。我想测试R包外文件的内容。

在测试过程中,我可以引用位于R包外的文件吗?

我的尝试

您可以下载可复现的示例 MyRepo.tar.gz

我的代码仓库名为"myRepo",其中包含一个R包"myRpkg"和一个充满杂项脚本的文件夹。

~/MyRepo/
~/MyRepo/MyRpkg
~/MyRepo/Scripts

"MyRpkg"中的测试位于/tests/文件夹中。
~/myRepo/myRpkg/tests/test.myscript.R

我希望能够测试Scripts文件夹中的文件:

~/MyRepo/Scripts/myscript.sh

我想阅读脚本以测试第一行内容,类似于这样做:
  check.script <- readLines("../../../Scripts/myscript.sh")[1]
  expect_true(grepl("echo", check.script))

如果我从MyRepo目录开始,这个功能就能正常工作:

cd ~/MyRepo
R CMD check MyRpkg

但是如果我切换到另一个目录,它会失败:

cd
R CMD check MyRepo/MyRpkg
1个回答

6

如R-exts所述

测试目录将被复制到检查区域,并使用该副本作为工作目录以及设置R_LIBS来运行测试,以确保在测试期间安装的软件包副本可以被library(pkg_name)找到。

默认情况下,检查目录将被创建在当前目录中。因此,在从~/MyRepo运行R CMD check时,测试目录将被复制到~/MyRepo/MyRpkg.Rcheck/tests,因此

check.script <- readLines("../../../Scripts/myscript.sh")[1]

被解释为

check.script <- readLines("~/MyRepo/Scripts/myscript.sh")[1]

as required. However starting from ~/ would imply

check.script <- readLines("~/Scripts/myscript.sh")[1]

这不是你想要的。一个解决方法是指定创建检查目录的目录,例如:
R CMD check -o MyRepo MyRepo/MyRpkg

为了让复制的tests目录与原始tests目录具有相同的“父级”。

但是,我想知道为什么文件必须是包外部的。如果您想在软件包测试中使用该文件,则将文件包含在软件包中是有意义的。您可以创建一个inst目录并将Scripts目录放在其中,以便在安装时将Scripts目录复制到软件包目录中,然后

check.script <- readLines("../foo/Scripts/myscript.sh")[1]

此脚本可用于测试脚本中,因为在 R CMD check 过程中,该包已安装在 MyRpkg.Rcheck/foo 中。或者你可以创建一个 exec 目录,并将脚本文件放在其中,然后

check.script <- readLines("../foo/exec/myscript.sh")[1]

会起作用。由于这两种解决方案只需要在测试期间找到已安装的软件包,因此无论您从哪里运行 R CMD check 都不会有问题。更多信息请参见软件包子目录软件包中的非 R 脚本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接