Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

conditional inclusion of arguments in a function call

I want to call a function but depending on the situation I might call it with extra arguments or not. Here is a simple example:

FUN <- function(arg1 = "default1", arg2 = "default2", arg3 = "default3")
          print(list(arg1, arg2, arg3))


x1 <- "hi"
x2 <- TRUE
x3 <- 1:3

use.arg3 <- FALSE   # This will decide if `x3` is used or not.

if (use.arg3) {
   FUN(arg1 = x1, arg2 = x2, arg3 = x3)
} else {
   FUN(arg1 = x1, arg2 = x2)
}

While the code is clear, it feels a little redundant. Also imagine that if I had similar use.arg1 and use.arg2 variables, I would have an ugly mix of possibilities (8)...

I have a solution posted below but I find it a little complicated, to the point that I always struggle to remember the exact syntax.

If you have a better idea, thank you for sharing.

like image 471
flodel Avatar asked Dec 21 '12 14:12

flodel


2 Answers

One solution is to use do.call after building a list with the proper arguments:

do.call(FUN, c(list(arg1 = x1, arg2 = x2),   # unconditional args
               list(arg3 = x3)[use.arg3]))   # conditional arg

And it generalizes well to multiple conditions:

do.call(FUN, c(list(arg1 = x1)[use.arg1]     # conditional arg
               list(arg2 = x2)[use.arg2]     # conditional arg
               list(arg3 = x3)[use.arg3]))   # conditional arg
like image 102
flodel Avatar answered Oct 31 '22 23:10

flodel


Continuing the discussion from the comments on flodel's answer, here's an extension of my idea, out of curiosity. Not sure if it's really a feasible option:

FUN(arg1 = x1, arg2 = x2, arg3 = if(use.arg3) x3 else formals(FUN)$arg3)
like image 29
joran Avatar answered Oct 31 '22 23:10

joran