我可以在测试R包时访问外部文件吗?

时间:2012-09-05 23:00:08

标签: r bash testing

我正在使用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 个答案:

答案 0 :(得分:6)

正如在R-exts中所说的那样

  

目录测试被复制到检查区域,测试以副本作为工作目录运行,并且设置R_LIBS以确保库(pkg_name)找到测试期间安装的软件包的副本。 / p>

默认情况下,在当前目录中创建检查目录。因此,当从R CMD check运行~/MyRepo时,tests目录将复制到~/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检查无关紧要。有关详细信息,请参阅Package subdirectoriesNon-R scripts in packages