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

Time:07-22

Is there a function that does the following ?

library(dplyr)

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

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

I know the purrr::when and ifelse functions but they don't work here.

CodePudding user response:

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.

  • Related