首页 > 解决方案 > 管道结果到多个参数(使用 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(右侧)函数之外,还有另一种方法使用|>吗?

标签: rpipe

解决方案


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 调用不支持函数“{”


推荐阅读