动态构建多个表达式
Dynamically build multiple expressions
我想使用 microbenchmark
函数对表达式计时,但其中一些需要动态创建(在 运行 时间)。
看起来我需要使用bquote
as.call
和Reduce
()但是我从来没有使用过它们而且作者没有解释他是什么做的很详细,让人很难理解发生了什么。
这是我想做的(非常简单):
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
我想使用 microbenchmark
函数对表达式计时,但其中一些需要动态创建(在 运行 时间)。
看起来我需要使用bquote
as.call
和Reduce
(
这是我想做的(非常简单):
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