首页 > 解决方案 > 堆肥函数中管道运算符的行为 purrr - dplyr

问题描述

purrr-dplyr 包中管道运算符的使用(简而言之)定义如下:

y%>%f(x,.,z) 与 f(x,y,z) 相同

我正在尝试使用管道运算符执行以下任务。首先,我在不使用管道的情况下向您展示任务:

#####for reproducibility
set.seed(50)
z0<-factor(sample(c(letters[1:3],NA),100,replace = T))
###the task
rep(1,length(table(z0)))

现在我想使用管道来做到这一点:

z0%>%table%>%rep(1,length(.))

但是结果不一样。管道运算符似乎无法处理对函数组合的正确分配。那是

y%>%f(x,g(.)) 应该与 f(x,g(y)) 相同

所以,具体的问题是 ti 是否可以做到

y%>%f(x,g(.))

预先感谢您的意见。

标签: rdplyrpipepurrr

解决方案


实现了第%>%一个参数规则,即如果.不是直接参数,它将先前的数据作为第一个参数传递给函数;在您的第二种情况下,参数rep1and length(.),因此第一个参数规则生效;为避免这种情况,请使用{}将表达式括起来;您可以在 Re-using the placeholder for attributes阅读更多相关信息:

重新使用属性的占位符

在右侧表达式中多次使用占位符很简单。但是,当占位符仅出现在嵌套表达式中时,magrittr 仍将应用第一个参数规则。原因是在大多数情况下,这会产生更干净的代码。

 x %>% f(y = nrow(.), z = ncol(.)) is equivalent to f(x, y = nrow(x), z = ncol(x))

可以通过将右侧括在大括号中来否决该行为:

x %>% {f(y = nrow(.), z = ncol(.))} is equivalent to f(y = nrow(x), z = ncol(x))
rep(1,length(table(z0)))
# [1] 1 1 1

等效为:

z0 %>% table %>% {rep(1,length(.))}
# [1] 1 1 1

推荐阅读