r - 堆肥函数中管道运算符的行为 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(.))
预先感谢您的意见。
解决方案
实现了第%>%
一个参数规则,即如果.
不是直接参数,它将先前的数据作为第一个参数传递给函数;在您的第二种情况下,参数rep
是1
and 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
推荐阅读
- c - 无法使用 Renesas r5F104GK 通过 I²C 从 VEML6030 读取(或仅获取 0x0000)
- c# - 无法使用 Masstransit 读取队列消息
- flutter - 颤动中的单个文本字段可以具有可变的行高吗?
- google-apps-script - 使用 Apps 脚本链接 Google 表格中的动态和手动数据
- c# - 如何将 System.Windows.Controls.Control 中的通用基类用于不同的超类,如 Button、TextBox、TextBlock
- c# - 如何在 C# 中创建与 BouncyCastle 的 TLS 连接?
- typescript - 从外部路径加载 sourcemap 源
- python-3.x - 如何使 dateparser 解析相对于给定日期的日期
- stripe-payments - Stripe 付款成功后更新我的数据库
- python - 快速 API - 有没有办法为变量定义数据类型(浮点数)而不明确提供变量名称?