r - 获取 system.time 或使用管道复制工作 %>%

标签 r dplyr piping magrittr

我倾向于经常使用管道运算符(%>%,来自 magrittrdplyr 库)。直到有一天我尝试使用右侧的 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/

相关文章:

audio - 使用 sox splice 对一组音频文件进行淡入淡出

r - R中具有2个分类变量和1个连续变量的折线图

r - 使用 ggplot2 中的 facet_grid 更改中断次数

返回遍历列表列表的循环内列表的名称

linux - 寻找 linux 应用程序或命令以使用 grep 和 sed 将图像通过管道传输

linux - 从 bash 搜索 jar 或 tar

r - 如何使用 stringr 从字符串中提取多个重叠的字符串?

r - 如何计算列表列中向量的长度(嵌套)

r - 从数据集查询

r - 具有双重重置的复数累加和