我的大部分工作都围绕着结核病的诊断测试。正如您可能想象的那样,能够快速评估和验证这些测试的输出是很方便的。我写了一个函数,here (为了清楚起见,减少了)。简而言之,它从测试中获取数字结果并生成制造商指定的解释。
这个函数对我来说效果很好——我已经通过数千次测试对其进行了验证,它对于我所抛出的任何东西来说都足够快。不过,我想将它和几个类似的功能捆绑到一个包中以供更广泛地使用,并且在这样做之前我想获得一些反馈:
这个函数依赖于一个非常大的 for 循环,它包裹着嵌套的 if-else 函数。它不是特别优雅,而且可怕的
for()
无疑会损害我的可信度(咳咳),但它确实有效。有更好的方法吗?如果是这样,重写代码是否足够好?上述函数中的标准是对北美测试的解释;世界其他地区遵循略有不同的标准。我也想要那些可用的。我正在考虑为每个单独的非导出函数。各种数据检查(不包括上述要点)将继续存在于主函数中,然后调用指定的子函数。这听起来合理吗?
还有其他建议或建议吗?风格、代码组织——什么都可以。
我意识到我可能应该把这只幼鸟赶出巢穴,但我主要是在真空中工作,所以有点紧张。非常感谢任何建议。
编辑:如果您错过了要点的链接,this is the function I'm talking about .
根据要求,sample test data .
最佳答案
经过编辑以反射(reflect)评论并根据测试数据进行验证
您可以完全避免任何类型的循环或 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
关于r - 在 R 中使用嵌套 if 评估一系列标准 - 有没有更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5985159/