我正在使用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
答案 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 subdirectories和Non-R scripts in packages。