3

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

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

  1. 该函数依赖于围绕嵌套 if-else 函数的大 for 循环。它不是特别优雅,而且这种恐惧for()无疑会损害我的可信度(咳咳),但它确实有效。有更好的方法吗?如果是这样,是否足以保证重新编写有效的代码?

  2. 上述函数中的标准用于解释北美测试;世界其他地区遵循略有不同的标准。我也想要那些可用的。我正在考虑为每个单独的非导出函数。各种数据检查(不包括上述要点)将继续存在于主函数中,然后调用指定的子函数。这听起来合理吗?

  3. 还有其他建议或建议吗?风格,代码组织——任何东西。

我意识到我可能应该把这只幼鸟赶出巢穴,但我主要是在真空中工作,所以有点紧张。任何意见是极大的赞赏。

编辑:如果您错过了要点的链接,这就是我正在谈论的功能


根据要求,取样测试数据

4

3 回答 3

4

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

您可以避免任何类型的循环或if完全避免使用 R 向量下标:

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
于 2011-05-12T22:37:14.130 回答
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"
于 2011-05-12T23:03:16.953 回答
1

如果您不想要for循环,请apply与编写的函数一起使用以返回解释。

于 2011-05-12T22:27:00.933 回答