我倾向于经常使用管道运算符(%>%
,来自 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 括在括号中来强制评估 RHS,但它给出了相同的行为:
rnorm(1E7) %>% mean %>% (function(x) system.time(x))
#### user system elapsed
#### 0 0 0
我的问题如下:
1.为什么命令system.time
放置在管道末端时无法按预期工作?
2. 有没有一种方法可以测量由管道组成的一行代码的计算时间,而不必将整行代码放在括号内(这会消除管道的实际好处...... .) 或使用 proc.time?
注意:与replicate
命令存在同样的问题。
最佳答案
我能做的第二个最好的事情是在 system.time
上创建一个包装器,它接受一个未计算的表达式并对其进行计算,然后您必须将定时表达式包装在大括号中并在您使用时引用它对它进行管道传输,以便在我的包装函数得到它的爪子之前不会对其进行评估:
> psystime = function(e){system.time(eval(e))}
> quote({rnorm(1e7) %>% mean}) %>% psystime
user system elapsed
0.764 0.004 0.767
>
我说第二好,因为最好的答案就是根本不这样做。有时管道是问题所在,而不是解决方案。
另一种可能性是将管道表达式用引号括起来,并将其提供给 system.time
包装器,该包装器将其参数的评估版本作为文本运行:
> esystime = function(e){system.time(eval(parse(text=e)))}
> "rnorm(1e7) %>% mean" %>% esystime
user system elapsed
1.075 0.033 1.137
我猜这个的用例实际上是当你有一个很长的管道并且想要快速查看它需要多长时间运行时,所以你自然想要只是塞住 %>% system.time
放在最后。假设您知道“行首”和“行尾”的键盘快捷键,将 system.time(
放在开头和 )
可能同样简单在最后。
关于r - 获取 system.time 或使用管道复制工作 %>%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39441067/