【问题标题】:conditional inclusion of arguments in a function call有条件地在函数调用中包含参数
【发布时间】:2012-12-09 03:58:00
【问题描述】:

我想调用一个函数,但根据情况我可能会用额外的参数调用它。这是一个简单的例子:

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)
}

虽然代码很清晰,但感觉有点多余。还可以想象,如果我有类似的 use.arg1use.arg2 变量,我会有一个丑陋的可能性组合 (8)...

我在下面发布了一个解决方案,但我发现它有点复杂,以至于我总是难以记住确切的语法。

如果你有更好的想法,谢谢分享。

【问题讨论】:

  • 前导行 if(!use.arg3) x3&lt;-"default3" 后跟函数这样简单的东西有什么问题?

标签: r function argument-passing


【解决方案1】:

一种解决方案是在使用适当的参数构建列表后使用do.call

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

它可以很好地推广到多种条件:

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

【讨论】:

  • 为什么不将它们结合起来,即do.call(FUN,list(arg1=x1,arg2=x2,arg3=x3)[c(use.arg1,use.arg2,use.arg3)]) 或者,我会做一个向量use.args &lt;- rep(TRUE,3) 并将我不想使用的任何参数设置为FALSE,这会给出do.call(FUN,list(arg1=x1,arg2=x2,arg3=x3)[use.args])。其他可能性(使用... 等)取决于实际情况,但这是最通用的答案。
  • 我觉得我有时会看到人们使用像 FUN(arg1 = x1, arg2 = x2, arg3 = if(use.arg3) x3 else NULL) 这样的结构,但我不确定这样做是否明智。
  • @joran,如果use.arg3FALSENULL 将用于arg3 而不是FUN 的默认值(如果有的话)。
  • @flodel 您在这里如何定义 FUN?如果 use.arg3
【解决方案2】:

出于好奇,继续 cmets 对 flodel 答案的讨论,这是我的想法的延伸。不确定这是否真的是一个可行的选择:

FUN(arg1 = x1, arg2 = x2, arg3 = if(use.arg3) x3 else formals(FUN)$arg3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2017-06-05
    • 2011-01-14
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多