首页 > 解决方案 > 如何匹配 R 中函数参数的多种组合?

问题描述

我们可以创建一个二维数组来匹配两个函数参数的组合吗?

例如,如果我编写一个带有 1 个参数的函数(除了数据输入参数):

choose_procedure <- function(x, what_to_do) {
  switch(what_to_do,
         "mean"   = {...}, # mean(x) or mean(x, na.rm = TRUE) or weighted.mean(x)
         "median" = {...}, # median(x)
         "square" = {...}, # x * x or x ^ 2
         "unique" = {...}, # unique(x)
         "log"    = {...}  # log(x) or log10(x)
  )
}

what_to_do我添加了内联注释以暗示每个输入可能有多个选择。

what_to_do=时"mean",应该是mean(x, na.rm = TRUE)还是mean(x, na.rm = FALSE)?同样,当what_to_do=时"log",应该是log(x)or log10(x)?等等。

为了解决这个问题,我想引入另一个参数choose_procedure(),称为"scenario". 所以如果调用choose_procedure()是:

choose_procedure(x = mtcars$mpg, what_to_do = "log", scenario = "A")

然后它将执行log(mtcars$mpg).
但如果电话是

choose_procedure(x = mtcars$mpg, what_to_do = "log", scenario = "B")

然后它将执行log10(mtcars$mpg).


一个只包含"log""scenario"描述 2x2 数组的示例:

choose_procedure()显然,这可以用 4 个 if 语句(每个组合一个)来处理,但是如果我们有更多的组合(如我打开的示例),将变得非常难以编程。

所以我有两个问题:

  1. 我正在寻找一种可以扩展到任何n × n数组的设置。
  2. 事实上,也许有一种方法可以推广到超过n × n?例如,如果我们有 3 个参数:"what_do_to", "scenario", "sub_scenario". 等等。

标签: rfunctionif-statementfunctional-programmingswitch-statement

解决方案


choose_procedure <- function(x, FUN, ...){
   if(...length()) FUN(x, ...)
   else FUN(x)
 }

x <- c(1,3,5,NA, 10)

choose_procedure(x, mean)
[1] NA

choose_procedure(x, mean, na.rm = TRUE)
[1] 4.75

choose_procedure(x, log)
[1] 0.000000 1.098612 1.609438       NA 2.302585

choose_procedure(x, log10)
[1] 0.0000000 0.4771213 0.6989700        NA 1.0000000

推荐阅读