當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


R magrittr pipe 管道

將對象通過管道轉發到函數或調用表達式中。

用法

lhs %>% rhs

參數

lhs

值或 magrittr 占位符。

rhs

使用 magrittr 語義的函數調用。

細節

使用%>%使用一元函數調用

當函數僅需要一個參數時,x %>% f 等效於 f(x)(並不完全等效;請參閱下麵的技術說明。)

配售lhs作為第一個參數rhs稱呼

rhs 調用中需要多個參數時,%>% 的默認行為是將 lhs 作為第一個參數,即 x %>% f(y) 相當於 f(x, y)

配售lhs其他地方在rhs稱呼

通常,您會希望 lhs 在第一個位置以外的其他位置調用 rhs。為此,您可以使用點 (.) 作為占位符。例如,y %>% f(x, .) 相當於 f(x, y)z %>% f(x, y, arg = .) 相當於f(x, y, arg = z)

將點用於次要目的

通常,除了 lhs 本身的值之外,rhs 調用中還需要 lhs 的某些屬性或特性,例如行數或列數。在 rhs 調用中多次使用點占位符是完全有效的,但根據設計,在嵌套函數調用中使用它時,行為略有不同。特別是,如果占位符僅在嵌套函數調用中使用,lhs 也將被放置為第一個參數!原因是在大多數 use-cases 中,這會產生最具可讀性的代碼。例如,iris %>% subset(1:nrow(.) %% 2 == 0) 相當於iris %>% subset(., 1:nrow(.) %% 2 == 0),但稍微更緊湊。可以通過將 rhs 用大括號括起來來否決此行為。例如, 1:10 %>% {c(min(.), max(.))} 相當於 c(min(1:10), max(1:10))

使用%>%與調用-或function-producingrhs

可以在 lhs 的管道化發生之前強製評估 rhs。當 rhs 生成相關調用或函數時,這非常有用。要首先評估 rhs ,請將其括在括號中,即 a %>% (function(x) x^2)1:10 %>% (call("sum")) 。與此相關的另一個示例是使用 $ 運算符訪問的引用類方法,其中可以執行 x %>% (rc$f) ,而不是 x %>% rc$f

使用 lambda 表達式%>%

每個rhs本質上是一元函數的one-expression主體。因此,在 magrittr 中定義 lambda 是非常自然的,就像常規函數的定義一樣:如果需要多個表達式,則將表達式主體括在一對大括號中, { rhs } 。但是,請注意,大括號內沒有“first-argument 規則”:這與編寫參數名稱為“.”(點)的一元函數完全相同。

使用 dot-place 支架作為lhs

當點用作 lhs 時,結果將是一個函數序列,即依次將整個右側鏈應用到其輸入的函數。請參閱示例。

技術說明

magrittr 管道運算符使用非標準評估。他們捕獲他們的輸入並檢查它們以找出如何繼續。首先,從所有單獨的右側表達式生成一個函數,然後通過將該函數應用於左側來獲得結果。對於大多數目的,人們可以忽略 magrittr 求值的微妙方麵,但某些函數可能會捕獲其調用環境,因此使用運算符不會完全等同於沒有 pipe-operators 的 "standard call"。

另一個注意事項是,在 pipe-chain(+, -, $, 等)中使用非 magrittr 運算符時建議特別注意,因為運算符優先級將影響鏈的評估方式。一般來說,建議使用 magrittr 提供的別名。

也可以看看

%<>% , %T>% , %$%

例子

# Basic use:
iris %>% head
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1          5.1         3.5          1.4         0.2  setosa
#> 2          4.9         3.0          1.4         0.2  setosa
#> 3          4.7         3.2          1.3         0.2  setosa
#> 4          4.6         3.1          1.5         0.2  setosa
#> 5          5.0         3.6          1.4         0.2  setosa
#> 6          5.4         3.9          1.7         0.4  setosa

# Use with lhs as first argument
iris %>% head(10)
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1           5.1         3.5          1.4         0.2  setosa
#> 2           4.9         3.0          1.4         0.2  setosa
#> 3           4.7         3.2          1.3         0.2  setosa
#> 4           4.6         3.1          1.5         0.2  setosa
#> 5           5.0         3.6          1.4         0.2  setosa
#> 6           5.4         3.9          1.7         0.4  setosa
#> 7           4.6         3.4          1.4         0.3  setosa
#> 8           5.0         3.4          1.5         0.2  setosa
#> 9           4.4         2.9          1.4         0.2  setosa
#> 10          4.9         3.1          1.5         0.1  setosa

# Using the dot place-holder
"Ceci n'est pas une pipe" %>% gsub("une", "un", .)
#> [1] "Ceci n'est pas un pipe"
  
# When dot is nested, lhs is still placed first:
sample(1:10) %>% paste0(LETTERS[.])
#>  [1] "1A"  "10J" "2B"  "9I"  "8H"  "3C"  "4D"  "5E"  "6F"  "7G" 

# This can be avoided:
rnorm(100) %>% {c(min(.), mean(.), max(.))} %>% floor
#> [1] -3 -1  2

# Lambda expressions: 
iris %>%
{
  size <- sample(1:10, size = 1)
  rbind(head(., size), tail(., size))
}
#>     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#> 1            5.1         3.5          1.4         0.2    setosa
#> 2            4.9         3.0          1.4         0.2    setosa
#> 3            4.7         3.2          1.3         0.2    setosa
#> 4            4.6         3.1          1.5         0.2    setosa
#> 5            5.0         3.6          1.4         0.2    setosa
#> 6            5.4         3.9          1.7         0.4    setosa
#> 7            4.6         3.4          1.4         0.3    setosa
#> 8            5.0         3.4          1.5         0.2    setosa
#> 143          5.8         2.7          5.1         1.9 virginica
#> 144          6.8         3.2          5.9         2.3 virginica
#> 145          6.7         3.3          5.7         2.5 virginica
#> 146          6.7         3.0          5.2         2.3 virginica
#> 147          6.3         2.5          5.0         1.9 virginica
#> 148          6.5         3.0          5.2         2.0 virginica
#> 149          6.2         3.4          5.4         2.3 virginica
#> 150          5.9         3.0          5.1         1.8 virginica

# renaming in lambdas:
iris %>%
{
  my_data <- .
  size <- sample(1:10, size = 1)
  rbind(head(my_data, size), tail(my_data, size))
}
#>     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#> 1            5.1         3.5          1.4         0.2    setosa
#> 2            4.9         3.0          1.4         0.2    setosa
#> 3            4.7         3.2          1.3         0.2    setosa
#> 4            4.6         3.1          1.5         0.2    setosa
#> 5            5.0         3.6          1.4         0.2    setosa
#> 6            5.4         3.9          1.7         0.4    setosa
#> 7            4.6         3.4          1.4         0.3    setosa
#> 8            5.0         3.4          1.5         0.2    setosa
#> 9            4.4         2.9          1.4         0.2    setosa
#> 10           4.9         3.1          1.5         0.1    setosa
#> 141          6.7         3.1          5.6         2.4 virginica
#> 142          6.9         3.1          5.1         2.3 virginica
#> 143          5.8         2.7          5.1         1.9 virginica
#> 144          6.8         3.2          5.9         2.3 virginica
#> 145          6.7         3.3          5.7         2.5 virginica
#> 146          6.7         3.0          5.2         2.3 virginica
#> 147          6.3         2.5          5.0         1.9 virginica
#> 148          6.5         3.0          5.2         2.0 virginica
#> 149          6.2         3.4          5.4         2.3 virginica
#> 150          5.9         3.0          5.1         1.8 virginica

# Building unary functions with %>%
trig_fest <- . %>% tan %>% cos %>% sin

1:10 %>% trig_fest
#>  [1]  0.0133878 -0.5449592  0.8359477  0.3906486 -0.8257855  0.8180174
#>  [7]  0.6001744  0.7640323  0.7829771  0.7153150
trig_fest(1:10)
#>  [1]  0.0133878 -0.5449592  0.8359477  0.3906486 -0.8257855  0.8180174
#>  [7]  0.6001744  0.7640323  0.7829771  0.7153150

源代碼:R/pipe.R

相關用法


注:本文由純淨天空篩選整理自Stefan Milton Bache等大神的英文原創作品 Pipe。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。