如何嵌套多个管道magrittr

时间:2016-06-01 19:49:51

标签: r magrittr

这开头是一个先行的问题,但后来变成了一个功能性问题,特别是关于magrittr。

我想添加一个 data_frame ,它会手动输入到已经存在的那个:

cars_0 <- mtcars %>% 
  mutate(brand = row.names(.)) %>%
  select(brand, mpg, cyl) 

new_cars <- matrix(ncol = 3, byrow = T, c(
  "VW Beetle",   25, 4, 
  "Peugeot 406", 42, 6))   # Coercing types is not an issue here.

cars_1 <- rbind(cars_0, 
  set_colnames(new_cars, names(cars_0))) 

我正在使用矩阵编写新车以增加“易读性”,因此需要将其列名设置为cars_0

如果有人像我一样喜欢magrittr,他们可能会先提出new_cars并将其传递给set_colnames

cars_1 <- rbind(cars_0, new_cars %>% 
  set_colnames(names(cars_0)))     

或者为了避免重复,他们想要指出cars_0并将其传递给rbind

cars_1 <- cars_0 %>% 
  rbind(., set_colnames(new_cars, names(.)))

然而,人们不能同时做这两件事,因为对谁进行管道传输存在困惑

cars_1 <- cars_0 %>% 
  rbind(., new_cars %>% set_colnames(names(.)))
## Error in match.names(clabs, names(xi)) : 
##   names do not match previous names

我的问题:有没有办法区分管道的两个参数?

1 个答案:

答案 0 :(得分:2)

简答:不。

更长的答案:我不确定这样做的理由是什么。 magrittr背后的哲学是不需要复合函数,其主要目的是使代码更容易阅读。例如:

f(g(h(x))) 

变为

h(x) %>% g() %>% f()

尝试以一种将两个对象放置为.参数的方式使用管道违背了简化的原则。在某些情况下,您可以使用嵌套管道,但环境应该保持不同。试图在同一环境中穿过两个管道可以比作穿过溪流。

enter image description here

不要越过溪流:)