通过管道将结果传递给多个参数(使用 R 4.1+)

wib*_*ley 6 r pipe

使用magrittr 管道( %>%),我偶尔会将结果通过管道传递给多个参数,例如

ds <- 
  datasets::airquality |> 
  head() 

ds %>%
  # ds |> 
  knitr::kable(
    x           = .,
    col.names   = tolower(colnames(.)),
    format      = "markdown"
  )
Run Code Online (Sandbox Code Playgroud)

结果

| 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|
Run Code Online (Sandbox Code Playgroud)

R 的新原生管道在 4.1.0 中引入|>)不支持这一点。替换为会引发此错误:%>%|>

Error in knitr::kable(head(datasets::airquality), x = ., col.names = tolower(colnames(.)),  : 
  object '.' not found
Run Code Online (Sandbox Code Playgroud)

发行说明中的​​描述(我的重点):

R 现在提供简单的本机前向管道语法 |>。前向管道的简单形式将左侧插入作为右侧调用中的第一个参数。作为语法转换的管道实现是由 Jim Hester 和 Lionel Henry 的建议推动的。

除了定义一个新的(匿名或显式)函数来包装下面提出的 rhs(右侧)函数之外,是否还有另一种方法使用|>?

wib*_*ley 4

Jumping Rivers的博客介绍了如何使用匿名函数和新的本机管道 (a) 将值传递给不是第一个参数的参数,以及 (b) 将值传递给多个参数。对于上面的问题:

ds |>
  {\(x) 
    knitr::kable(
      x           = x,
      col.names   = tolower(colnames(x)),
      format      = "markdown"
    )
  }()                                      # Don't forget the parentheses.

Run Code Online (Sandbox Code Playgroud)

这利用了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()
Run Code Online (Sandbox Code Playgroud)

注意:如果您收到以下错误,您可能忘记了定义匿名函数后的()即左括号和右括号)。

错误:管道的 RHS 调用不支持函数“{”

  • 如果您想更接近原始语法,可以使用“\(.)”吗? (2认同)