【问题标题】:What does |> (pipe greater than) mean in R?|>(管道大于)在R中是什么意思?
【发布时间】:2021-08-17 00:58:08
【问题描述】:

我最近在 R 中遇到了代码|>。它是一个竖线字符(竖线),后跟一个大于号。

这是一个例子:

mtcars |> head()

|> 代码在做什么?

【问题讨论】:

    标签: r pipe operators


    【解决方案1】:

    |> 是基本的 R“管道”运算符。是new in version 4.1.0

    简而言之,管道运算符提供运算符左侧 (LHS) 的结果作为右侧 (RHS) 的 first 参数。

    考虑以下几点:

    1:3 |> sum()
    #[1] 6
    

    这里,数字 1 到 3 的向量作为sum 函数的第一个参数提供。

    左侧结果总是成为右侧调用的第一个参数。考虑:

    args(sum)
    #function (..., na.rm = FALSE) 
    
    c(1:3, NA_real_) |> sum(na.rm = TRUE)
    #[1] 6
    

    call 的强调很重要,因为只要第一个参数被命名,您就可以将 LHS 重定向到其他参数。考虑:

    args(rnorm)
    #function (n, mean = 0, sd = 1) 
    100 |> rnorm(n = 5)
    #[1]  99.94718  99.93527  97.46838  97.38352 100.56502
    
    args(sum)
    #function (..., na.rm = FALSE) 
    sum(na.rm = TRUE, ... = c(1:2,NA_real_))
    #[1] 3
    TRUE |> sum(... = c(1:2,NA_real_))
    #[1] NA
    

    使用|> 运算符的一个好处是,与嵌套函数调用相比,它可以使代码在逻辑上更易于遵循:

    split(x = iris[-5], f = iris$Species) |>
      lapply(min) |>
      do.call(what = rbind) 
    #           [,1]
    #setosa      0.1
    #versicolor  1.0
    #virginica   1.4
    
    #Compared to:
    do.call(rbind,lapply(split(iris[-5],iris$Species),min))
    

    此功能类似于magrittr::%>% 运算符(也在dplyr 中实现)。

    但是,与%>% 不同的是,目前没有办法将 LHS 多次通过管道输送到右侧或任意位置。 Magrittr 使用. LHS 占位符和{} 任意放置。

    library(magrittr)
    iris[iris$Sepal.Length > 7,] %>% subset(.$Species=="virginica")
    
    TRUE %>% {sum(c(1:2,NA_real_),na.rm = .)}
    [1] 3
    

    此外,与基本 R |> 不同,%>% 运算符可以在没有 () 的情况下通过管道传递到函数调用:

    1:3 |> sum
    #Error: The pipe operator requires a function call as RHS
    
    1:3 %>% sum
    #[1] 6
    

    【讨论】:

    • 还值得注意的是,这会引发错误:1:3 |> sum 而这不会1:3 %>% sum
    • 你可以使用匿名函数TRUE |> {\(x) sum(c(1:2,NA_real_), na.rm = x)}()# [1] 3
    • @akrun 我其实也想过做一个\() 问答,但也许你愿意?
    • @G.Grothendieck 不是没有括号。
    • 显然。这就是我要表达的观点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2020-10-08
    • 1970-01-01
    • 2018-01-12
    相关资源
    最近更新 更多