R管道(%>%)功能 - 存储和部分使用?

时间:2017-02-23 17:15:28

标签: r dplyr magrittr

我喜欢管道提高可读性的想法,但我使用它的困难是因为它感觉不灵活。到目前为止,我只是成功了,当我的目标是通过一组函数h(g(f(x,foo),bar)直接管道X时,东西)

$books['morality']['title'] = $title;
$books['morality']['author'] = $author;
$books['morality']['thumbnail'] = $pic2;
$books['morality']['file'] = $pic;
$books['morality']['comment'] = $comment;

如果我想存储一个中间输出,以便我可以拥有h(x,stuff,f(x,foo)),那可能吗?我试过了

x %>%
f(foo) %>%
g(bar) %>%
h(stuff)

但是失败了。分配不起作用,因为第一个参数是名称而不是值;是否存在相反的等价物?

我知道你可以使用“。”多次引用x或其中的一部分,但有没有办法最初只使用它的一部分?我想在不同的列上执行不同的功能,例如

x %>% 
intermediate = f(foo) %>% 
g(bar)

但我无法弄清楚如何将第一个参数限制为data.frame(x[,1],apply(.[,2:3],2,fun1),apply(.[,4],2,fun2)) 而不是x[,1]。我不能使用x,因为它会永远丢弃其余部分。有没有办法做到这一点,或者我应该结束管道,执行这些功能,并启动另一个管道?将所有%>% select(1) %>%放入数据框然后x是最简单的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您可以编写一个函数来执行可以包含在链中的赋值。像

这样的东西
save_to <- function(x, v) {
    var <- substitute(v)
    eval(bquote(.(var) <- .(x)), envir=globalenv())
    x
}


library(magrittr)
x<-1:10
f<-function(x) x+1
g<-function(x) x*2
h<-function(x) paste(x, collapse=", ")    

x %>% f %>% g %>% save_to(z) %>% h
# [1] "4, 6, 8, 10, 12, 14, 16, 18, 20, 22"
z
#  [1]  4  6  8 10 12 14 16 18 20 22

请注意,这会将值保存到全局环境中。出于这个原因,它可能不是一个好主意(具有副作用的函数通常是函数式语言中的糟糕设计实践)。将它分解成不同的链条会更好。

z <- x %>% f %>% g
z %>% h