【发布时间】:2017-01-19 08:17:30
【问题描述】:
我经常使用管道运算符(%>%,来自magrittr,或dplyr 库)。直到有一天,我尝试使用右侧的system.time 命令。
system.time(mean(rnorm(1E7))) # ok
#### user system elapsed
#### 3.52 0.05 3.58
rnorm(1E7) %>% mean %>% system.time # ?
#### user system elapsed
#### 0 0 0
所以我去阅读文档并尝试了这个(它说你可以通过将它括在括号中来强制评估 RHS,但它给出了相同的行为:
rnorm(1E7) %>% mean %>% (function(x) system.time(x))
#### user system elapsed
#### 0 0 0
我的问题如下:
1. 为什么将命令system.time 放置在管道末端时不能按预期工作?
2. 有没有办法测量由管道组成的一行代码的计算时间,而不必将整行放在括号内(这会抵消管道的实际好处.. .) 还是使用 proc.time?
注意:replicate 命令也有同样的问题。
【问题讨论】:
-
不是 [r] 大师,但在管道 (
%>%) 文档的末尾有一些技术说明提到管道与函数调用并不完全相同。确切的措辞是 %>% 帮助上的技术说明可能有用: magrittr 管道操作员使用非标准评估。他们捕获他们的输入并检查它们以找出如何进行。首先从所有单独的右侧表达式生成一个函数,然后通过将此函数应用于左侧获得结果。。这可能对您有帮助。 -
@Bhargav Rao 谢谢,但对我来说这听起来有点像中文 ;-)
-
%>%传递 lhs 表达式的 求值 结果,而 not 表达式本身。所以在第二种情况下,就像你给了a<-rnorm(1E7);d<-mean(a);system.time(d)。 -
@nicola 好吧,我现在明白了:它总是会给出 0,但它工作正常......所以你说除了将 system.time 放在整行之前别无他法括号?
-
@agenis 猜猜看。