Search code examples
rif-statementdplyrpurrr

Equivalent function of `if` statement in R so that it can be used with the pipe operator


Is there a function that does the following ?

library(dplyr)

cond = T
if (cond) { 
  print('Hello')
}
# [1] "Hello"

# How can I achieve the same as above with a pipe ? 
print('Hello') %>% function_if(cond)

The purrr::when and ifelse functions don't seem to work here.


Solution

  • Admittedly, I don't see utility in this ... but

    function_if <- function(data, expr) if (isTRUE(expr)) force(data)
    cond <- TRUE
    print('Hello') %>%
      function_if(cond)
    # [1] "Hello"
    print('Hello') %>%
      function_if(cond) %>%
      class()
    # [1] "Hello"                 # <-- action of 'print'
    # [1] "character"             # <-- output from 'class', to show that
    print('Hello') %>%            # <-- this never happens here
      function_if(FALSE) %>%
      class()
    # [1] "NULL"                  # <-- output from 'class', no 'print' output
    

    I don't know that I would ever use this, to be candid.

    The way it works: data (which can be any object) is defined lazily here. The order of execution here is: %>%, function_if, and only if isTRUE(expr), it forces evaluation of data. If it was true, then data is evaluated and returned; if it was not true, then function_if does not force data, so its lazy presence is never instantiated, and NULL is implicitly returned instead.

    Perhaps a better name for this function would be stoppipe_if_not, meaning that all data-flow in the pipe (whether data.frame or anything else) will not be passed along if the condition is not precisely TRUE.