使用R中的嵌套ifs评估一系列标准是否有更好的方法?

时间:2011-05-12 22:20:00

标签: r coding-style package control-flow

我的大部分工作都围绕结核病的诊断测试。正如您可能想象的那样,能够快速评估和验证这些测试的输出是很方便的。我写了一个函数来做到这一点here(为了清晰起见而减少)。简而言之,它采用测试的数值结果并产生制造商指定的解释。

这个功能对我来说效果很好 - 我已经对数以千计的测试进行了验证,并且它对我投入的任何东西都足够快。我想将它和一些类似的功能捆绑到一个包中以供更广泛的使用,但是,在我这样做之前,我想得到一些反馈:

  1. 该函数依赖于围绕嵌套if-else函数的大型for循环。它并不是特别优雅,恐惧for()无疑会损害我的信誉(咳咳),但它有效。有更好的方法吗?如果是这样,是否足以保证重写Code That Works?

  2. 上述功能的标准是用于解释北美的测试;世界其他地方的标准略有不同。我也希望有那些可用的。我正在考虑为每个人分别提供一个单独的非导出功能。各种数据检查(从上面的要点中排除)将继续存在于main函数中,然后该函数将调用指定的子函数。这听起来合理吗?

  3. 还有其他建议或建议吗?风格,代码组织 - 任何事情。

  4. 我意识到我应该把这只幼鸟从巢中推出来,但我主要在真空中工作,所以有点紧张。非常感谢任何建议。

    编辑:如果您错过了要点的链接this is the function I'm talking about


    根据要求,sample test data

3 个答案:

答案 0 :(得分:4)

编辑以反映评论并验证测试数据

你可以完全避免使用任何类型的循环或if并简单地使用R vector subscripting:

qft.interp <- function(nil, tb, mitogen, tbnil.cutoff = 0.35){

  # Set a tolerance to avoid floating point comparison troubles.
  tol <- .Machine$double.eps ^ 0.5

  # Set up the results vector
  result <- rep(NA, times = length(nil))
  result[nil+tol > 8.0] <- "Indeterminate"
  result[is.na(result) & (tb-nil+tol > tbnil.cutoff) & 
          (tb-nil+tol > .25*nil)] <- "Positive"
  result[is.na(result) & (tb-nil+tol < tbnil.cutoff | tb-nil+tol < .25*nil) &
        !(mitogen-nil+tol < 0.5)] <- "Negative"
  result[is.na(result) & ((tb-nil+tol < tbnil.cutoff | tb-nil+tol < .25*nil) &
          mitogen-nil+tol < 0.5)] <- "Indeterminate"
  result
}

all(with(tests, qft.interp(nil, tb, mitogen)) == tests$interp)

[1] TRUE

答案 1 :(得分:4)

result[ nil + (tol > 8.0)] <- "Indeterminate"
result[(tb - nil + (tol > tbnil.cutoff) ) & (tb - nil + (tol > .25 * nil) )] <- "Positive"
result[ (tb - nil + (tol < tbnil.cutoff) )| (tb - nil + (tol < .25 * nil)) &
                         !(mitogen - nil + tol < 0.5) ] <- "Negative"
result[ (tb - nil + (tol < tbnil.cutoff) ) | (tb - nil + (tol < .25 * nil) ) & 
                          (mitogen - nil + (tol < 0.5) ) ] <- "Indeterminate"

答案 2 :(得分:1)

如果您不想要for循环,请使用apply并写入函数以返回解释。