Search code examples
rpipemagrittr

How to write any(diff(vec) < 0) as a pipe?


I have a vector vec like this vec <- c(1,4,5) and I want to check whether there are any steps down in the vector. I do this using:

any(diff(vec) < 0)
# [1] FALSE

No steps down. Okay. But when I try to use this code in a pipe I get a TRUE and an warning:

library(magrittr)
vec %>% diff() %>% any(. < 0)
# [1] TRUE
# Warning message:
# In any(., . < 0) : coercing argument of type 'double' to logical

How to correctly write any(diff(vec) < 0) as a pipe?


Solution

  • You have a couple of solutions already, but no explanation. The reason your original didn't work is that magrittr pipes treat . differently when it is in a nested function call.

    By nested function call, I mean that . is not an argument to the function that is the target of the pipe. In any(. < 0), that function is any(), and its argument is . < 0, which is actually a function call to the < function. So the . is in a "nested function call".

    If . is only in a nested function call, it is implicitly used as the first argument as well, so the code

    x %>% any(. < 0)
    

    is treated as

    any(x, x < 0)
    

    To suppress this weird behaviour, put the expression in braces, i.e. your example would be

    vec %>% diff() %>% { any(. < 0) }