Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should I use %$% instead of %>%?

Tags:

r

magrittr

Recently I have found the %$% pipe operator, but I am missing the point regarding its difference with %>% and if it could completely replace it.


Motivation to use %$%

  • The operator %$% could replace %>% in many cases:
mtcars %>% summary()
mtcars %$% summary(.)
mtcars %>% head(10)
mtcars %$% head(.,10)
  • Apparently, %$% is more usable than %>%:
mtcars %>% plot(.$hp, .$mpg) # Does not work
mtcars %$% plot(hp, mpg)     # Works
  • Implicitly fills the built-in data argument:
mtcars %>% lm(mpg ~ hp, data = .)
mtcars %$% lm(mpg ~ hp)
  • Since % and $ are next to each other in the keyboard, inserting %$% is more convenient than inserting %>%.

Documentation

We find the following information in their respective help pages.

(?magrittr::`%>%`):

Description:

     Pipe an object forward into a function or call expression.

Usage:

     lhs %>% rhs

(?magrittr::`%$%`):

Description:

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

Usage:

     lhs %$% rhs

I was not able to understand the difference between the two pipe operators. Which is the difference between piping an object and exposing a name? But, in the rhs of %$%, we are able to get the piped object with the ., right?


Should I start using %$% instead of %>%? Which problems could I face doing so?

like image 538
Gorka Avatar asked Nov 16 '25 06:11

Gorka


1 Answers

In addition to the provided comments:

%$% also called the Exposition pipe vs. %>%:

This is a short summary of this article https://towardsdatascience.com/3-lesser-known-pipe-operators-in-tidyverse-111d3411803a

"The key difference in using %$% or %>% lies in the type of arguments of used functions."

One advantage, and as far as I can understand it, for me the only one to use %$% over %>% is the fact that we can avoid repetitive input of the dataframe name in functions that have no data as an argument.

For example the lm() has a data argument. In this case we can use both %>% and %$% interchangeable.

But in functions like the cor() which has no data argument:

mtcars %>% cor(disp, mpg) # Will give an Error
cor(mtcars$disp, mtcars$mpg)

is equivalent to

mtcars %$% cor(disp, mpg)

And note to use %$% pipe operator you have to load library(magrittr)

Update: on OPs comment: The pipe independent which one allows us to transform machine or computer language to a more readable human language.

ggplot2 is special. ggplot2 is not internally consistent. ggplot1 had a tidier API then ggplot2

Pipes would work with ggplot1: library(ggplot1) mtcars %>% ggplot(list( x= mpg, y = wt)) %>% ggpoint() %>% ggsave("mtcars.pdf", width= 8 height = 6)

In 2016 Wick Hadley said: "ggplot2 newver would have existed if I'd discovered the pipe 10 years earlier!" https://www.youtube.com/watch?v=K-ss_ag2k9E&list=LL&index=9

like image 80
TarJae Avatar answered Nov 18 '25 19:11

TarJae



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!