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
4

1 回答 1

6

正如它在 R-exts 中所说

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

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

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

被解释为

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

按要求。但是从开始~/意味着

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 检查期间包安装在 MyRpkg.Rcheck/foo 中。或者,您可以创建一个 exec 目录并将脚本文件放在那里,然后

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

会工作。由于这两种解决方案只需要在测试期间找到安装的软件包,因此您从哪里运行 R CMD check 并不重要。有关详细信息,请参阅包中的包子目录​​非 R 脚本

于 2012-09-13T21:35:11.970 回答