微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

管道结果到多个参数使用 R 4.1+

如何解决管道结果到多个参数使用 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 xkable 的第一个未命名参数

处理第二个“.”参考,您可以先使用一个函数(在本例中为 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 举报,一经查实,本站将立刻删除。