对于小函数,仅根据参数值编写条件语句是微不足道的。例如,我有一个从ex-STATA数据帧中提取变量标签的函数。 output
有两种选择 - 类型,environment
和df
。
f_extract_stata_label <- function(df, output="environment") {
if (output=="env") {
lab_env <- new.env()
for (i in seq_along(names(df))) {
lab_env[[names(df)[i]]] <- attr(df, "var.labels")[i]
}
return(lab_env)
} else if (output=="df") {
lab_df <- data.frame(var.name = names(d_tmp),
var.label = attr(d_tmp, "var.labels"))
return(lab_df)
}
}
然而,我怀疑这不是好习惯。首先,函数如何依赖于output
尚不清楚 - 读者必须阅读代码的一半才能找到答案。其次,将来向output
添加选项会使函数难以阅读。
那么我应该如何重写这个功能呢?
答案 0 :(得分:1)
R在其核心统计库中使用了这种模式,其中&#34;标签&#34;字符串有意义。这些是R&#39的调度系统没有用的功能。那就是说,你想要的仍然像派遣一样。
您可以重构它以使用调用专用于特定输出类型的函数的开关。然后发生两件事。首先,额外的函数调用可以清楚地了解使用回溯时的上下文。其次,它使功能更小,更容易阅读。
我会怀疑你是否真的想要使用调度函数,以及为什么单独的直接函数是不合适的。