2012-10-26 3 views
1

내가 우연히 문제에 대한 최소한의 예를의 일종이다 parent.frame는, 즉 lm 코드 여기 mf 오른쪽에모델 피팅 기능과 environemnts 여기

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

model.frame에 교묘하게 구축 통화가의 라인이 포함되어 있습니다. 나는 mysubset을 전달하고 있지만, eval은 그것을 찾는다. (나는 틀렸다고 생각한다.) 기본 환경에서 그것을 찾았고 그것을 찾지 못했다. 내가 아마 lm.fit을 사용할 수 있다는 것을 알고 있지만 내부에 환경을 만드는 방법이 있습니까 lm의 경우 parent.frame입니까?

답변

2

이 경우에 model.frame (실제로는 model.frame.default)을 호출하면 .GlobalEnvmysubset이 표시됩니다. 그러나보다 일반적인 일반화는 data에 전달 된 객체 또는 거기에없는 객체를 전달하려고하는 formula 환경에서 다양한 객체를 평가하려고한다는 것입니다. 그리고 그 환경은 .GlobalEnv입니다.

그래서 model.frame.default는 "(environment(formula) 인) env에, 만약 거기, data에서 개체 mysubset을 평가하거나 변환

eval(substitute(subset), data, env) 

를 호출합니다.이하는 것입니다 해결하기 위해

한 가지 방법 함수 내에서 함수를 호출 할 때 생성 된 환경을 가정하는 함수 내에서 수식을 다시 작성하십시오 (여기서 mysubset이 있음).

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

이렇게하면 model.frame.defaultmysubset을 찾을 수 있습니다.