conditional inclusion of arguments in a function call

余生长醉 提交于 2021-02-07 05:54:45

问题


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.


回答1:


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



回答2:


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)


来源:https://stackoverflow.com/questions/13992367/conditional-inclusion-of-arguments-in-a-function-call

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!