我在R中编写单元测试,需要读取同一目录中定义的一些测试数据。但我也希望能够运行该单元测试,无论当前的工作目录是什么。
有没有办法告诉R从加载文件,其中 here 被定义为持有正在执行的函数的源文件的目录?
答案 0 :(得分:2)
取决于你对“我正在编写单元测试”的意思。如果您只是从任何地方获取该功能,David是对的,我甚至不知道需要这样做,因为您知道它是哪个目录。
我将该函数包含在一个包中,然后在R中有一些机制允许您使数据可用于加载或通过延迟加载。请参阅手册Writing R Extensions中的第1.1.5节(包中的数据)。这是做到这一点的R方式。
Gabor Grothendieck在R邮件列表的this thread中提供的另一个选项是在脚本顶部添加以下行:
this.dir <- dirname(parent.frame(2)$ofile)
这将使用source()
提供源文件的目录。 Gabor称之为肮脏的黑客,我同意他的观点。
在旁注中,还要检查R中的单元测试包:
答案 1 :(得分:1)
如果函数不在包中,并且通过source()
从文件中获取,那么源引用可能提供了一些工作。需要参数keep.source = TRUE
,并阅读R Journal article by Duncan Murdoch
这是一个简单的例子:
> setwd("./Downloads/")
> source("../foo.R", keep.source=TRUE) ## if options("keep.source") is FALSE
> bar
function(a, b) {
a + b
}
> body(bar)
{
a + b
}
attr(,"srcfile")
../foo.R
attr(,"wholeSrcref")
bar <- function(a, b) {
a + b
}
> srcref <- attr(body(bar), "srcref")[[1]]
> attr(srcref, "srcfile")
../foo.R
> ls(attr(srcref, "srcfile"))
[1] "Enc" "encoding" "filename" "timestamp" "wd"
> attr(srcref, "srcfile")$filename
[1] "../foo.R"
> attr(srcref, "srcfile")$wd
[1] "/home/gavin/Downloads"
当然,这假设您不知道源函数的来源有什么用处,但函数需要来源......
如果这是在一个包中,那么您可以将数据放在./data
目录或./inst/
中的任意目录中。您可以使用前者的data()
个toload数据集,以及system.file()
个数据包中的任何文件。请参阅相关帮助页面。
答案 2 :(得分:0)
完全普遍地实现这一点并没有现实的希望。函数不需要从文件加载,可以通过代码动态创建,从工作区加载等等。