假设我有一个包含函数的列表:
funcs <- list(
loop = function(n) {
result <- 0
for (i in seq_len(n)) {
result <- result + i
}
result
},
vect = function(n) sum(seq_len(n))
)
如果我想使用bench
进行基准测试,我可以这样做:
N <- 1e6
bench::mark(funcs$loop(N), funcs$vect(N)) # Ok
这很好用然而,我有两个小nits与这种方法。
1.我需要记住为每个函数写一个表达式。例如,如果我向funcs
添加一个函数,我需要记住也将其作为表达式添加到mark(...)
。
1.我还重复了函数的求值(即(N)
重复了不止一次)。很明显,这是微不足道的,但它仍然是一种重复的形式。
似乎mark
的exprs
参数应该会有所帮助,它允许我执行以下操作:
bench::mark(exprs = lapply(funcs, \(f) expression(f(1e6)))) # Error in f(1e+06) : could not find function "f"
但是,它会生成错误。如何生成适合传递给exprs
参数的列表?
1条答案
按热度按时间mnemlml81#
而不是使用
expression()
,需要使用subsititute()
(如Konrad Rudolph所示)。但是,正如最初编写的那样,它捕获了错误的参数;重新分配给临时变量可以解决这个问题。下面的代码可以工作。