【发布时间】:2021-12-11 00:18:55
【问题描述】:
我们可以创建一个二维数组来匹配两个函数参数的组合吗?
例如,如果我编写一个带有 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)
)
}
我添加了内联 cmets 以暗示每个 what_to_do 输入可能有多个选择。
当what_to_do = "mean" 时,应该是mean(x, na.rm = TRUE) 还是mean(x, na.rm = FALSE)?
同样,当what_to_do = "log" 时,应该是log(x) 还是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 数组:
-
"what_to_do"有 2 个选项:log()或log10() -
"scenario"有两个选项:"A"或"B"
显然,这可以用 4 个 if 语句(每个组合一个)来处理,但如果我们有更多组合(如我打开的 choose_procedure() 示例),编程将变得非常困难。
所以我有两个问题:
- 我正在寻找一种可以扩展到任何可能的 n × n 数组的设置。
- 事实上,也许有一种方法可以泛化到超过n × n?例如,如果我们有 3 个参数:
"what_do_to"、"scenario"、"sub_scenario"。等等。
【问题讨论】:
-
了解
match.fun -
可以,但通常不是一个好主意。您的代码似乎想用字符串模拟 OOP 或函数式编程。请改用适当的工具——即高阶函数、OOP 或其他什么。特别是,您似乎正在重塑策略模式。
-
@KonradRudolph,
reinventing the strategy pattern是什么意思?我想这个问题确实是关于函数式编程的(虽然我在发帖时没有意识到)。但是 R 中不鼓励 FP 吗? -
@Emman FP 是,但你的代码不是 FP——它使用string typing,而不是在适当的地方使用正确的类型,即函数。
-
@Emman wurli 的回答是使用字符串时的一个很好的解决方案。但是,是的,更好的解决方案是首先不使用字符串,如另一个答案所示。
标签: r function if-statement functional-programming switch-statement