書こうとしている関数の振る舞いに困惑しています。私の例は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_function
I の環境では、コードの最初の部分を実行すると、グローバル環境と同じオブジェクトが存在するため、奇妙に感じます。
編集: パッケージの作成者である Terry Therneau からも有用な情報を受け取りましたsurvival
。これが彼の答えです:
これは、model.frame によって行われる標準外の評価に起因する問題です。私が見つけた唯一の方法は、元の coxph 呼び出しに model.frame=TRUE を追加することです。これは R の重大な設計上の欠陥だと思います。標準外の評価は暗黒面のようなものです。魅力的で簡単な道であり、常に悪い結果に終わります。テリー T.