1

これは、私が遭遇した問題の最小限の例です。

mylm <- function(formula,data,subset=NULL){
  mysubset <- subset # some other clever manipulation
  lm(formula,data,mysubset)
}
mydata <- data.frame(x=rnorm(10),y=rnorm(10))
mylm(y~x,mydata) # this fails!

最後の行が失敗する理由は、lmへの呼び出しが含まれておりmodel.frame、 で評価されますparent.frame。つまりlm、コード行が含まれています。

mf <- eval(mf, parent.frame())

ここmfで、右側の は巧妙に構築された への呼び出しmodel.frameです。私mysubseteval. おそらく使用できることはわかっていますが、forlm.fit内の環境を作成する方法はありますか?mylmparent.framelm

4

1 に答える 1

2

この場合、あなたの言うとおりです。 model.frame(実際には、model.frame.default) への呼び出しは で探してmysubset.GlobalEnvます。ただし、より適切な一般化は、渡されたオブジェクト内のさまざまなオブジェクトを評価しようとしている、dataまたはそこにない場合は、渡された の環境内でさまざまなオブジェクトを評価しようとしていると言うformulaことです。そして、その環境は.GlobalEnv.

だからmodel.frame.default呼び出します

eval(substitute(subset), data, env)

mysubsetこれは、「でオブジェクトを評価する、dataまたはそこにない場合はenv(である) でオブジェクトを評価する」に変換されますenvironment(formula)

これを回避する 1 つの方法は、関数内で数式を再作成することです。ここでは、関数が呼び出されたときに作成された環境がmysubset存在すると仮定します。

mylm <- function(formula,data,subset=NULL){
  mysubset <- subset # some other clever manipulation
  lm(formula(deparse(formula)),data,subset=mysubset)
}

そうすれば、model.frame.default見つかるはずmysubsetです。

于 2012-10-26T12:17:30.287 に答える