`<-` 实际上比 `=` 慢吗?

Is `<-` actually slower than `=`?

下面的执行时间差异是真的吗?

library(microbenchmark)
microbenchmark(x = NULL, x <- NULL, times = 100e3)

Unit: nanoseconds
      expr min lq    mean median uq  max neval
         x   0  0 0.60819      0  0 8426 1e+05
 x <- NULL   0  0 1.75101      0  1 8727 1e+05

我收到一条警告,大约 75% 的评估执行时间为非正数。尽管如此,每次我有 运行 这个,我都会得到一个一致的结果:x = NULL 平均比 x <- NULL 快。

这些语句在此上下文中的作用不同。如果你 运行 例如

你会看到这个
microbenchmark(y = NULL, x <- NULL, times = 100e3)

这创建了一个对象 x,但没有对象 y。您可以 运行 使用方括号 运行 进行的测试:

microbenchmark({y = NULL}, {x <- NULL}, times = 100e3)

microbenchmark 函数以不同的方式解析 ... 参数。 x=NULL 永远不会被解释为一个赋值,而是一个函数参数。 因此,据我所知,您并没有真正测量第一个参数的时间。

你需要做这样的事情:

 microbenchmark(test1 = `=`(x, NULL), test2 = `<-`(x, NULL), times = 100e3)

或如@Roland 在评论中所述。 这会调用赋值运算符后面的适当函数。