rpipetidyversemagrittr

What are the differences and use cases of the five Magrittr Pipes %>%, %<>%, %$%, %!>% and %T>%?


Magrittr has those different pipes:

What are their differences and use cases?


Solution

  • %>% Pipe

    Pipe an object forward into a function or call expression.

    library(magrittr)
    1:10 %>% head()   # Basic use
    #[1] 1 2 3 4 5 6
    1:10 %>% head     # Works also
    #[1] 1 2 3 4 5 6
    #1:3 %>% approxfun(1:3, 4:6)  #But in this case empty parentheses are needed
    #Error in if (is.na(method)) stop("invalid interpolation method") :
    1:3 %>% approxfun(1:3, 4:6)()
    #[1] 4 5 6
    
    1:10 %>% head(3)  # Use with lhs as first argument
    #[1] 1 2 3
    
    "Ceci n'est pas une pipe" %>% gsub("une", "un", .)  # Using the dot place-holder
    #[1] "Ceci n'est pas un pipe"
    
    1:3 %>% paste0(LETTERS[.], 0)    # When dot is nested, lhs is still placed first
    #[1] "1A0" "2B0" "3C0"
    1:3 %>% {paste0(LETTERS[.], 0)}  # This can be avoided with {}
    #[1] "A0" "B0" "C0"
    

    See also: What are the disadvantages when using a function without empty parentheses with %>% the pipe of magrittr?.

    %<>% Assignment pipe

    Pipe an object forward into a function or call expression and update the lhs object with the resulting value.

    x <- -2:2
    x %<>% abs %>% sort
    x  # 0 1 1 2 2
    

    %$% Exposition pipe

    Expose the names in lhs to the rhs expression. This is useful when functions do not have a built-in data argument.

    iris %$% cor(Sepal.Length, Sepal.Width)
    #[1] -0.1175698
    

    See also: Should I use %$% instead of %>%?.

    %!>% Eager pipe

    Evaluate from left to right. Whereas %>% is lazy and only evaluates the piped expressions when needed, %!>% is eager and evaluates the piped input at each step. Also it evaluates in the same environment.

    0 %!>% (\(x) {cat(1); x}) %!>% (\(x) cat(2))  # Evaluates from left to right
    #12
    0 %>% (\(x) {cat(1); x}) %>% (\(x) cat(2))    # Evaluates only cat(2) as the first result is never used
    #2
    
    1 %!>% assign("a", .)  # Work
    a
    #[1] 1
    0 %>% assign("a", .)   # Does not work as there is an additional environment
    a
    #[1] 1
    0 %>% assign("a", ., envir=parent.env(environment())) # Give explicitly where to evaluate
    a
    #[1] 0
    

    %T>% Tee pipe

    Pipe a value forward into a function- or call expression and return the original value instead of the result. This is useful when an expression is used for its side-effect, say plotting or printing.

    matrix(1:4, 2) %T>% plot %>% sum  # sum gets the same data like plot
    #[1] 10
    

    See also: magrittr tee pipe %T>% equivalent.