问:在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)
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有很好的文档记录.
我经常发现需要在管道中保存中间产品.虽然我的用例通常是为了避免重复过滤器以便以后拆分,操作和重新组装,但这种技术在这里可以很好地工作:
df %>%
filter(b < 3) %>%
{. ->> intermediateResult} %>% # this saves intermediate
mutate(b = b*2) %>%
bind_rows(intermediateResult)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4087 次 |
| 最近记录: |