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

Abe*_*Abe 3 testing bash r

我正在使用testthat包来测试更大的存储库中的R包.我想测试R包外的文件内容.

我可以在测试时引用位于R包外的文件吗?

我试过了什么

可重现的示例可以下载为MyRepo.tar.gz

我的存储库名为"myRepo",它包含一个R包,"myRpkg"和一个充满各种脚本的文件夹

~/MyRepo/
~/MyRepo/MyRpkg
~/MyRepo/Scripts
Run Code Online (Sandbox Code Playgroud)

"MyRpkg"中的测试位于/tests/文件夹中

~/myRepo/myRpkg/tests/test.myscript.R
Run Code Online (Sandbox Code Playgroud)

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

~/MyRepo/Scripts/myscript.sh
Run Code Online (Sandbox Code Playgroud)

我想阅读脚本来测试第一行的内容,做这样的事情:

  check.script <- readLines("../../../Scripts/myscript.sh")[1]
  expect_true(grepl("echo", check.script))
Run Code Online (Sandbox Code Playgroud)

如果我从MyRepo目录开始,这可以正常工作:

cd ~/MyRepo
R CMD check MyRpkg
Run Code Online (Sandbox Code Playgroud)

但如果我移动到另一个目录,它会失败:

cd
R CMD check MyRepo/MyRpkg
Run Code Online (Sandbox Code Playgroud)

Hea*_*ner 6

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

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

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

check.script <- readLines("../../../Scripts/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)

被解释为

check.script <- readLines("~/MyRepo/Scripts/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)

按要求.然而从开始~/意味着

check.script <- readLines("~/Scripts/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)

这不是你想要的.解决方法是指定创建检查目录的目录,即

R CMD check -o MyRepo MyRepo/MyRpkg
Run Code Online (Sandbox Code Playgroud)

这样复制的tests目录与原始tests目录具有相同的"祖父" .

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

check.script <- readLines("../foo/Scripts/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)

可以在测试脚本中使用,因为在R CMD检查期间将包安装在MyRpkg.Rcheck/foo中.或者,您可以创建一个exec目录并将脚本文件放在那里,然后

check.script <- readLines("../foo/exec/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)

会工作.由于这两种解决方案只需要在测试期间找到安装的软件包,因此从哪里运行R CMD检查无关紧要.有关详细信息,请参阅包中的Package子目录Non-R脚本.