rdplyrggvismagrittr

R Conditional evaluation when using the pipe operator %>%


When using the pipe operator %>% with packages such as dplyr, ggvis, dycharts, etc, how do I do a step conditionally? For example;

step_1 %>%
step_2 %>%

if(condition)
step_3

These approaches don't seem to work:

step_1 %>%
step_2 
if(condition) %>% step_3

step_1 %>%
step_2 %>%
if(condition) step_3

There is a long way:

if(condition)
{
step_1 %>%
step_2 
}else{
step_1 %>%
step_2 %>%
step_3
}

Is there a better way without all the redundancy?


Solution

  • Here is a quick example that takes advantage of the . and ifelse:

    X<-1
    Y<-T
    
    X %>% add(1) %>% { ifelse(Y ,add(.,1), . ) }
    

    In the ifelse, if Y is TRUE if will add 1, otherwise it will just return the last value of X. The . is a stand-in which tells the function where the output from the previous step of the chain goes, so I can use it on both branches.

    Edit As @BenBolker pointed out, you might not want ifelse, so here is an if version.

    X %>% 
    add(1) %>% 
     {if(Y) add(.,1) else .}
    

    Thanks to @Frank for pointing out that I should use { braces around my if and ifelse statements to continue the chain.