【问题标题】:Dynamically build multiple expressions动态构建多个表达式
【发布时间】:2021-11-20 19:16:52
【问题描述】:

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

看来我需要使用bquote as.callReduce (Dynamically creating functions and expressions) 但我从未使用过它们并且作者没有详细解释他在做什么,所以很难理解是什么正在发生。

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

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])
)

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

任何帮助将不胜感激:)

【问题讨论】:

    标签: r dynamic expression benchmarking microbenchmark


    【解决方案1】:

    如果您想动态构建一个更改参数名称的函数调用,您需要构建一个命名列表,其中列表的名称是参数名称。您还需要延迟对参数的评估,以便传递语言对象。有很多不同的方法可以做到这一点,但在这种情况下,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
    

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      相关资源
      最近更新 更多