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 に答える