我的大部分工作都围绕结核病的诊断测试。正如您可能想象的那样,能够快速评估和验证这些测试的输出是很方便的。我写了一个函数来做到这一点here(为了清晰起见而减少)。简而言之,它采用测试的数值结果并产生制造商指定的解释。
这个功能对我来说效果很好 - 我已经对数以千计的测试进行了验证,并且它对我投入的任何东西都足够快。我想将它和一些类似的功能捆绑到一个包中以供更广泛的使用,但是,在我这样做之前,我想得到一些反馈:
该函数依赖于围绕嵌套if-else函数的大型for循环。它并不是特别优雅,恐惧for()
无疑会损害我的信誉(咳咳),但它有效。有更好的方法吗?如果是这样,是否足以保证重写Code That Works?
上述功能的标准是用于解释北美的测试;世界其他地方的标准略有不同。我也希望有那些可用的。我正在考虑为每个人分别提供一个单独的非导出功能。各种数据检查(从上面的要点中排除)将继续存在于main函数中,然后该函数将调用指定的子函数。这听起来合理吗?
还有其他建议或建议吗?风格,代码组织 - 任何事情。
我意识到我应该把这只幼鸟从巢中推出来,但我主要在真空中工作,所以有点紧张。非常感谢任何建议。
编辑:如果您错过了要点的链接this is the function I'm talking about。
根据要求,sample test data。
答案 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
并写入函数以返回解释。