11

I'm a big fan of the %>% operator from magrittr/dplyr and use it whenever possible. I'm having problems, however, using it to pipe to the seq() function.

As a trivial example, imagine I have a variable x, and I want to create a sequence from x-5 to x+5. I could do it like this:

> x <- 10
> seq(from = x-5, to = x+5, by = 1)
 [1]  5  6  7  8  9 10 11 12 13 14 15

But for the life of me I can't get it to work properly with piping. To demonstrate, let me sneak up on the problem a little bit. Assume x <- 10.

Piping works in some situations ...

The following example silently pipes 10 to the from parameter and uses the ., along with some arithmetic, to set the to parameter to 15, giving a sequence 10:15 as expected.

> x %>% seq(.+5)
[1] 10 11 12 13 14 15

I can explicitly set the from parameter as below, and it also gives the same, expected result (10:15):

> x %>% seq(from = ., to = .+5)
[1] 10 11 12 13 14 15

But doesn't work in others ...

Now a little tweak on the previous example. I want to try to replicate my initial example and produce a sequence from x-5 to x+5. I would expect that I could set the from parameter to .-5, but this does not give the expected result:

> x %>% seq(from = .-5, to = .+5)
[1]  5 15

It seems that the from and to are being correctly set to 5 and 15 respectively. But it appears that the by parameter has been set to . (i.e. 10) to give the unexpected result 5 15 rather than the sequence 5:15.

I can try to explicitly set the by parameter, but now I get an error:

> x %>% seq(from = .-5, to = .+5, by = 1)
Error in seq.default(., from = . - 5, to = . + 5, by = 1) : 
  too many arguments

You can see what it has done here, piping the . to the first parameter, but then it has my three explicit parameters to deal with also, and the error results.

It worked fine right up until I wanted to do some arithmetic using . in the from parameter.

Is there a way to do what I want to do, or is it just a fact of life that certain functions are not fully compatible with %>%?

1 Answer 1

14

You can prevent %>% from inserting . into the first argument by surrounding the right hand side with brace brackets:

10 %>% { seq(from = .-5, to = .+5) }
## [1]  5  6  7  8  9 10 11 12 13 14 15
Sign up to request clarification or add additional context in comments.

1 Comment

Good Lord, was it that simple?! Thank you :)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.