1

这开始是一个审美问题,但后来变成了一个功能性问题,特别是关于 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

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

4

1 回答 1

3

简短的回答:没有。

更长的答案:我不确定这样做的理由是什么。其背后的理念magrittr取消嵌套复合函数,其主要目的是让代码更易于阅读。例如:

f(g(h(x))) 

变成

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

试图以将两个对象作为.论点解释的方式使用管道违背了简化的哲学。在某些情况下,您可以使用嵌套管道,但环境应该保持不同。试图在同一环境中穿越两条管道可以比作穿越溪流。

在此处输入图像描述

不要越过溪流:)

于 2016-06-02T00:37:49.057 回答