使用依赖于参数值的控制流写入R函数

时间:2014-10-21 21:04:41

标签: r function refactoring

对于小函数,仅根据参数值编写条件语句是微不足道的。例如,我有一个从ex-STATA数据帧中提取变量标签的函数。 output有两种选择 - 类型,environmentdf

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添加选项会使函数难以阅读。

那么我应该如何重写这个功能呢?

1 个答案:

答案 0 :(得分:1)

R在其核心统计库中使用了这种模式,其中&#34;标签&#34;字符串有意义。这些是R&#39的调度系统没有用的功能。那就是说,你想要的仍然像派遣一样。

您可以重构它以使用调用专用于特定输出类型的函数的开关。然后发生两件事。首先,额外的函数调用可以清楚地了解使用回溯时的上下文。其次,它使功能更小,更容易阅读。

我会怀疑你是否真的想要使用调度函数,以及为什么单独的直接函数是不合适的。

相关问题