在我的R脚本中,我希望在不中断管道的情况下,在一个长管道的中间打印一条消息(这需要很长时间才能运行).我需要这个来跟踪正在运行的管道的进度.

我try 创建一个简单的函数,在不中断管道的情况下打印消息:

CatPipe <- function(x, message = NULL) {
  cat(message, sep = "\n")
  return(x)
}

下面是一个实现示例:

require(dplyr)
mtcars %>% 
  CatPipe("Hello1") %>% 
  {
    Sys.sleep(1)
    .
  } %>% 
  CatPipe("Hello2") %>% 
  {
    Sys.sleep(1)
    .
     } %>% 
    head(5) %>% 
    CatPipe("Hello3")

然而,打印的信息并不像预期的那样.无论当前步骤是否完成,消息都以相反的顺序打印!

Hello3
Hello2
Hello1
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

对此有什么解释吗?我应该对函数进行任何更改吗?有没有使用dplyrmagrittr或类似包的替代方案?

推荐答案

%>%管道使用lazy evaluation,这意味着它在需要之前不会计算表达式.在实践中,这意味着它达到管道的end,然后向后工作...magrittr包定义了eager pipe运算符%!>%,它具有您想要的行为(%>%实际上也来自magrittr;它被导入并由dplyr重新导出)

library(magrittr)
mtcars %!>% 
  CatPipe("Hello1") %!>% 
  {
    Sys.sleep(1)
    .
  } %!>% 
  CatPipe("Hello2") %!>% 
  {
    Sys.sleep(1)
    .
     } %!>% 
    head(5) %!>% 
    CatPipe("Hello3")
  • 我不能保证,从懒惰的判断转变为Eager 的判断,不会在一个复杂的管道中产生其他副作用
  • Native-R管道|>也使用延迟求值(为了测试它,我必须编写一个类似于CatPipe()函数的SleepPipe()函数,因为本地管道不允许任意的{.}表达式).
  • FWIW R for Data Science反驳了这个答案:它说,使用惰性求值的函数在管道工作流中不起作用,因为"管道依次计算每个元素,所以你不能依赖这种行为".我想这是因为magrittr re-implemented the pipe to use lazy evaluation in version 2.0.

R相关问答推荐

R绑定具有不同时间观察的两个数据帧

feature_weights参数没有影响Xgboost

高质量地将R格式的图表从Word中输出

geom_Ribbon条件填充创建与数据不匹配的形状(ggplot 2 r)

从API中抓取R数据SON

使用tidyverse方法绑定行并从一组管道列表执行左连接

如何动态更新selectizeInput?

迭代通过1个长度的字符串长字符R

错误:非常长的R行中出现意外符号

当我们有多个特殊字符时,使用gsub删除名称和代码'

R中1到n_1,2到n_2,…,n到n_n的所有组合都是列表中的向量?

从多个线性回归模型中提取系数

计算数据帧中指定值之前的行数,仅基于每行之后的future 行,单位为r

如何将使用rhandsontable呈现的表值格式化为百分比,同时保留并显示完整的小数精度?

从多面条形图中删除可变部分

根据约束随机填充向量的元素

远离理论值的伽马密度曲线下面积的近似

删除数据帧中特定行号之间的每第三行和第四行

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

R-使用stri_trans_General()将其音译为德语字母