Recently I have found the %$%
pipe operator, but I am missing the point regarding its difference with %>%
and if it could completely replace it.
%$%
%$%
could replace %>%
in many cases:mtcars %>% summary()
mtcars %$% summary(.)
mtcars %>% head(10)
mtcars %$% head(.,10)
%$%
is more usable than %>%
:mtcars %>% plot(.$hp, .$mpg) # Does not work
mtcars %$% plot(hp, mpg) # Works
mtcars %>% lm(mpg ~ hp, data = .)
mtcars %$% lm(mpg ~ hp)
%
and $
are next to each other in the keyboard, inserting %$%
is more convenient than inserting %>%
.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?
No, you shouldn't use %$%
routinely. It is like using the with()
function, i.e. it exposes the component parts of the LHS when evaluating the RHS. But it only works when the value on the left has names like a list or dataframe, so you can't always use it. For example,
library(magrittr)
x <- 1:10
x %>% mean()
#> [1] 5.5
x %$% mean()
#> Error in eval(substitute(expr), data, enclos = parent.frame()): numeric 'envir' arg not of length one
Created on 2022-02-06 by the reprex package (v2.0.1.9000)
You'd get a similar error with x %$% mean(.)
.
Even when the LHS has names, it doesn't automatically put the .
argument in the first position. For example,
mtcars %>% nrow()
#> [1] 32
mtcars %$% nrow()
#> Error in nrow(): argument "x" is missing, with no default
Created on 2022-02-06 by the reprex package (v2.0.1.9000)
In this case mtcars %$% nrow(.)
would work, because mtcars
has names.
Your example involving .$hp
and .$mpg
is illustrating one of the oddities of magrittr
pipes. Because the .
is only used in expressions, not alone as an argument, it is passed as the first argument as well as being passed in those expressions. You can avoid this using braces, e.g.
mtcars %>% {plot(.$hp, .$mpg)}