动态构建多个表达式

Dynamically build multiple expressions

我想使用 microbenchmark 函数对表达式计时,但其中一些需要动态创建(在 运行 时间)。

看起来我需要使用bquote as.callReduce)但是我从来没有使用过它们而且作者没有解释他是什么做的很详细,让人很难理解发生了什么。

这是我想做的(非常简单):

library(microbenchmark)

# random number of benchmarks
n <- rpois(n = 1, lambda = 5)

# random names
expressions <- LETTERS[rpois(n = n, lambda = 10)]

# random parameters
times <- runif(n = n, max = 1e-5)

microbenchmark(
  expressions[1] = Sys.sleep(times[1]),
  expressions[2] = Sys.sleep(times[2]),
  ...
  expressions[n] = Sys.sleep(times[n])
)

我明白要求别人做所有事情是不鼓励的,所以至少有人能告诉我应该从哪里开始吗?

任何帮助将不胜感激:)

如果您想在更改参数名称的地方动态构建函数调用,则需要构建一个命名列表,其中列表的名称就是参数名称。您还需要延迟对参数的评估,以便传递语言对象。有很多不同的方法可以做到这一点,但在这种情况下 bquote() 可能是最有帮助的。例如

set.seed(15)
n <- rpois(n = 1, lambda = 5)
expressions <- LETTERS[rpois(n = n, lambda = 10)]
times <- runif(n = n, max = 1e-5)

params <- setNames(
  lapply(times, function(x) bquote(Sys.sleep(.(x)))),
  expressions)
params
# $G
# Sys.sleep(7.06628567539156e-06)
# $H
# Sys.sleep(8.62313656602055e-06)
# $L
# Sys.sleep(8.41785145225003e-06)
# $K
# Sys.sleep(4.47443719021976e-06)
# $F
# Sys.sleep(9.64666954241693e-06)

有了这个命名的表达式列表后,您可以使用 do.call 函数调用 microbenchmark 将参数列表转换为实际参数。

do.call("microbenchmark", params)
#  expr min  lq mean median  uq   max neval
#     G 200 300  312    300 300  1600   100
#     H 200 200  478    300 300 19100   100
#     L 200 250  288    300 300   500   100
#     K 200 200  284    300 300   700   100
#     F 200 300  300    300 300  1700   100