如何用R语言switch()改写多条件分支的自定义函数?
用switch()重构你的R函数
没问题,我来帮你把这个用if分支的函数改成更清晰的switch版本,刚好能对应你之前看到的多值映射的switch用法逻辑。
首先,先看改写后的完整代码:
sample <- function(M, meth) { d <- switch( meth, # 多个meth参数对应同一个采样函数 sin_low = samplesin(M), sin_high = samplesin(M), GP = sampleGP(M), GP_high = sampleGP(M), # 处理无效参数的默认分支 stop("Invalid method specified: ", meth) ) return(d) }
关键逻辑解释
- 匹配规则:
switch的第一个参数是要匹配的表达式(这里就是传入的meth参数),后续的name = 表达式结构会精确匹配meth的字符串值。比如当meth是"sin_low"或"sin_high"时,都会执行samplesin(M);"GP"或"GP_high"则执行sampleGP(M)。 - 默认分支:最后一行没有写
name =的部分是默认分支——当meth不匹配前面任何一个值时,就会执行这部分代码。我这里加了stop()来抛出明确的错误提示,比你原来的函数更健壮(原来的函数如果传了无效的meth,会返回NULL,很难排查问题)。 - 代码可读性:相比并列的
if,switch把所有分支逻辑集中在一起,更直观,尤其是当分支数量变多的时候,维护起来更方便。
和你之前看到的示例对比
你之前见过的switch是用来做分类映射(比如把多个cat映射到catX/Y/Z),这次的逻辑本质是一样的——把多个输入值映射到同一个操作,只是这里的操作是调用函数而不是赋值常量而已。
如果想要更简洁的写法(避免重复写函数调用),也可以先做一次映射再执行,适合分支非常多的场景:
sample <- function(M, meth) { meth_map <- list( sin_low = "samplesin", sin_high = "samplesin", GP = "sampleGP", GP_high = "sampleGP" ) func_name <- meth_map[[meth]] if (is.null(func_name)) { stop("Invalid method specified: ", meth) } d <- do.call(func_name, list(M)) return(d) }
内容的提问来源于stack exchange,提问作者Chicago1988
相关产品推荐
相关产品推荐

