将中间输出分配给临时变量作为dplyr管道的一部分

low*_*rul 18 pipeline r dplyr

问:在R dplyr管道中,如何将一些中间输出分配给临时变量以便在管道中进一步使用?

我的方法可行.但它分配到全局框架中,这是不可取的.必须有更好的方法,对吗?我认为我的方法涉及评论线将得到预期的结果.没有骰子.困惑为什么不起作用.

df <- data.frame(a = LETTERS[1:3], b=1:3)
df %>%
  filter(b < 3) %>%
  assign("tmp", ., envir = .GlobalEnv) %>% # works
  #assign("tmp", .) %>% # doesn't work
  mutate(b = b*2) %>%
  bind_rows(tmp)
  a b
1 A 2
2 B 4
3 A 1
4 B 2
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 16

这并不能创造在全球环境中的对象:

df %>% 
   filter(b < 3) %>% 
   { 
     { . -> tmp } %>% 
     mutate(b = b*2) %>% 
     bind_rows(tmp) 
   }
Run Code Online (Sandbox Code Playgroud)

如果您使用. ->> tmp而不是. -> tmp将其插入管道中,也可以将其用于调试:

{ browser(); . } %>% 
Run Code Online (Sandbox Code Playgroud)

  • 这只是一个品味问题,分配工作原理相同,但对我来说,右侧分配似乎有点像管道中的流动:-) (2认同)

ali*_*ire 9

pipeR是一个扩展管道功能而不添加不同管道的软件包(如同magrittr).要分配,您传递一个变量名称,~在括号中引用作为管道中的元素:

library(dplyr)
library(pipeR)

df %>>%
  filter(b < 3) %>>%
  (~tmp) %>>% 
  mutate(b = b*2) %>>%
  bind_rows(tmp)
##   a b
## 1 A 2
## 2 B 4
## 3 A 1
## 4 B 2

tmp
##   a b
## 1 A 1
## 2 B 2
Run Code Online (Sandbox Code Playgroud)

虽然语法不是非常具有描述性,但是pipeR很好的文档记录.


GGA*_*son 7

我经常发现需要在管道中保存中间产品.虽然我的用例通常是为了避免重复过滤器以便以后拆分,操作和重新组装,但这种技术在这里可以很好地工作:

df %>%
  filter(b < 3) %>%
  {. ->> intermediateResult} %>%  # this saves intermediate 
  mutate(b = b*2) %>%
  bind_rows(intermediateResult)    
Run Code Online (Sandbox Code Playgroud)