如何解决管道结果到多个参数使用 R 4.1+
使用 magrittr pipe (%>%
),我偶尔会将结果通过管道传递给多个参数,例如
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's new native pipe (|>
,introduced in 4.1.0) 不支持这个。用 %>%
替换 |>
会引发此错误:
Error in knitr::kable(head(datasets::airquality),x = .,col.names = tolower(colnames(.)),:
object '.' not found
release notes 中的描述(我的重点):
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 release 功能。
R 现在提供用于创建函数的速记符号,例如(x) x + 1 被解析为 function(x) x + 1。
它比像这样显式定义函数要简洁一些
kable2 <- function (x) {
knitr::kable(
x = x,format = "markdown"
)
}
ds |>
kable2()
注意:如果你收到下面的错误,你可能忘记了匿名函数定义后的()
(即,左括号和右括号) .
错误:管道的 RHS 调用不支持函数“{”
,正如 Keith McNulty 在最近的 https://1drv.ms/b/s!AkROTDoCWFJnlrZOPiV74h3456Trwg 中所解释的那样,
用于 ”。”新的 R 本机管道中的引用已被删除。相反,您必须按照您的建议使用中间函数,但也要利用
本机 |>
管道进入第一个 未命名 参数。
因此,如果您没有使用 col.names
参数,
library(dplyr)
ds <- datasets::airquality |> head()
ds %>%
knitr::kable(
x = .,format = "markdown"
)
可以换成
ds |>
knitr::kable(
format = "markdown"
)
as x
是 kable
的第一个未命名参数
处理第二个“.”参考,您可以先使用一个函数(在本例中为 dplyr::rename_with
)
ds |>
dplyr::rename_with(tolower) |>
knitr::kable(
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 |
由 Medium post (v2.0.0) 于 2021 年 6 月 29 日创建
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。