r - 在 R 中使用嵌套 if 评估一系列标准 - 有没有更好的方法?

标签 r coding-style package control-flow

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

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

  1. 这个函数依赖于一个非常大的 for 循环,它包裹着嵌套的 if-else 函数。它不是特别优雅,而且可怕的 for() 无疑会损害我的可信度(咳咳),但它确实有效。有更好的方法吗?如果是这样,重写代码是否足够好?

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

  3. 还有其他建议或建议吗?风格、代码组织——什么都可以。

我意识到我可能应该把这只幼鸟赶出巢穴,但我主要是在真空中工作,所以有点紧张。非常感谢任何建议。

编辑:如果您错过了要点的链接,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/

相关文章:

Java 编码约定 : Getters & Setters

java - 重构:用方法对象替换方法解释

r - 有条件地将 mutate_at 应用于 R 中数据帧中的特定行

r - 在 dplyr 中跨列过滤

r - 如何在 R 中垂直合并相同的单元格,类似于在 Excel 中?

php - 了解PHP中的MVC View

python - pip 安装包两次

python - AttributeError: 'module' 对象没有属性 'xxxx'

haskell - 当我尝试安装 hlint 时,出现围绕 old-time-1.1.0.3 的错误

r - R 中多列的卡方检验