我不确定我是否使用do.call
了正确的方法:
test <- function(test) {
string <- deparse(substitute(test))
start <- regexpr("\\(", string)
end <- regexpr(")", string) - 1
distribution <- substr(string, 0, start-1)
string.arguments <- substr(string, start+1, end)
v <- read.table(text=unlist(strsplit(string.arguments, ",")))
list.arguments <- lapply(t(v), function(x) x)
for (i in 1:1000000) {
do.call(distribution, list.arguments)
}
}
这里的目标是能够发送分布,例如rnorm
and rgamma
,后跟参数给函数,而不是评估函数。
这是使用 do.call 和只是简单地调用函数的比较:
> system.time(test(rnorm(100, 1, 10)))
user system elapsed
17.772 0.000 17.820
> system.time(for(i in 1:1000000) { rnorm(100,0,1)} )
user system elapsed
13.940 0.004 14.015
问题是双重的:
- do.call 真的需要多花 20% 的时间吗?
- 这是接受不同分布和参数的正确方法吗?