5

書こうとしている関数の振る舞いに困惑しています。私の例はsurvivalパッケージから来ていますが、質問はそれよりも一般的だと思います。基本的には以下のコード

library(survival)
data(bladder)  ## this will load "bladder", "bladder1" and "bladder2"

mod_init <- coxph(Surv(start, stop, event) ~ rx + number, data = bladder2, method = "breslow")
survfit(mod_init)

興味のあるオブジェクトが得られます。ただし、関数で記述すると、

my_function <- function(formula, data) {
  mod_init <- coxph(formula = formula, data = data, method = "breslow")
  survfit(mod_init)
  }

my_function(Surv(start, stop, event) ~ rx + number, data = bladder2)

関数は最後の行でエラーを返します。

 Error in eval(predvars, data, env) : 
  invalid 'envir' argument of type 'closure' 
10 eval(predvars, data, env) 
9 model.frame.default(formula = Surv(start, stop, event) ~ rx + 
    number, data = data) 
8 stats::model.frame(formula = Surv(start, stop, event) ~ rx + 
    number, data = data) 
7 eval(expr, envir, enclos) 
6 eval(temp, environment(formula$terms), parent.frame()) 
5 model.frame.coxph(object) 
4 stats::model.frame(object) 
3 survfit.coxph(mod_init) 
2 survfit(mod_init) 
1 my_function(Surv(start, stop, event) ~ rx + number, data = bladder2) 

自分に欠けている明らかな何かがあるのか​​、それともそのような行動が正常なのか、私は興味があります。my_functionI の環境では、コードの最初の部分を実行すると、グローバル環境と同じオブジェクトが存在するため、奇妙に感じます。

編集: パッケージの作成者である Terry Therneau からも有用な情報を受け取りましたsurvival。これが彼の答えです:

これは、model.frame によって行われる標準外の評価に起因する問題です。私が見つけた唯一の方法は、元の coxph 呼び出しに model.frame=TRUE を追加することです。これは R の重大な設計上の欠陥だと思います。標準外の評価は暗黒面のようなものです。魅力的で簡単な道であり、常に悪い結果に終わります。テリー T.

4

2 に答える 2

-2

もしあなたが

Surv(start, stop, event) ~ rx + number

がパラメータとして入っていると、正しく作成されません。入れてみて

is.Surv(formula)

関数の最初の行として。私はそれがうまくいかないと思うので、関数の適用ファミリーを使用することをお勧めします。

于 2016-05-21T17:27:19.923 に答える