在R中,有没有办法知道定义给定函数的源文件的路径?

时间:2011-03-04 10:44:51

标签: unit-testing r

我在R中编写单元测试,需要读取同一目录中定义的一些测试数据。但我也希望能够运行该单元测试,无论当前的工作目录是什么。

有没有办法告诉R从加载文件,其中 here 被定义为持有正在执行的函数的源文件的目录?

3 个答案:

答案 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)

完全普遍地实现这一点并没有现实的希望。函数不需要从文件加载,可以通过代码动态创建,从工作区加载等等。