r - 管道结果到多个参数(使用 R 4.1+)
问题描述
使用magrittr 管道( %>%
),我偶尔会通过管道将结果传递给多个参数,例如
ds <-
datasets::airquality |>
head()
ds %>%
# ds |>
knitr::kable(
x = .,
col.names = tolower(colnames(.)),
format = "markdown"
)
结果:
| ozone| solar.r| wind| temp| month| day|
|-----:|-------:|----:|----:|-----:|---:|
| 41| 190| 7.4| 67| 5| 1|
| 36| 118| 8.0| 72| 5| 2|
| 12| 149| 12.6| 74| 5| 3|
| 18| 313| 11.5| 62| 5| 4|
| NA| NA| 14.3| 56| 5| 5|
| 28| NA| 14.9| 66| 5| 6|
但是R 的新原生管道(在 4.1.0 中引入|>
)不支持这一点。替换为抛出此错误:%>%
|>
Error in knitr::kable(head(datasets::airquality), x = ., col.names = tolower(colnames(.)), :
object '.' not found
发行说明中的描述(我的重点):
R 现在提供了一个简单的本机正向管道语法 |>。前向管道的简单形式将左侧作为第一个参数插入到右侧调用中。作为语法转换的管道实现是由 Jim Hester 和 Lionel Henry 的建议推动的。
除了定义一个新的(匿名或显式)函数来包装下面提出的 rhs(右侧)函数之外,还有另一种方法使用|>
吗?
解决方案
Jumping Rivers的博客描述了如何使用匿名函数和新的本地管道 (a) 将值传递给不是第一个参数的参数,以及 (b) 将值传递给多个参数。对于上面的问题:
ds |>
{\(x)
knitr::kable(
x = x,
col.names = tolower(colnames(x)),
format = "markdown"
)
}() # Don't forget the parentheses.
这利用了R 4.1.0 发布功能。
R 现在提供了用于创建函数的简写符号,例如 (x) x + 1 被解析为 function(x) x + 1。
它比明确定义函数要简单一些
kable2 <- function (x) {
knitr::kable(
x = x,
col.names = tolower(colnames(x)),
format = "markdown"
)
}
ds |>
kable2()
注意:如果您收到以下错误,您可能在定义匿名函数后忘记了()
(即左括号和右括号)。
错误:管道的 RHS 调用不支持函数“{”
推荐阅读
- python - 为什么 Django 不能根据标签显示正确的类别?
- google-chrome-devtools - 以编程方式更改浏览器导航器插件
- zurb-foundation - 基础 5 和顶栏在中等显示器上不起作用
- azure-active-directory - 为什么在 Microsoft 标识平台中自动添加脱机范围
- c# - C#如何有效检测使用的是哪张显卡
- project-reactor - Java RX 的 Flux.merge 和 switchIfEmpty
- java - 如何在 netbeans 编辑器 Java Swing 中使用滚动条
- python-3.x - 使用 gcloud 在 Jenkins Pipeline 中的 GCP 上启动 VM
- python - 在 Python 中阻止鼠标单击
- reactjs - 在反应路由器dom url中添加复选框值