2013-04-08 6 views
5

업데이트 : 이전 제목은 Is there any specific way to pass data frame as an argument to a function? 이었지만 여기에 멋진 사람들에 따르면 올바른 질문이 아니 었습니다. 원본 게시물은 아래에 있습니다. R 함수의 내부에서 효과 플롯을 실행하는 방법

내가 somefunc(sleepstudy)와 기능 다음 실행

,

somefunc<-function (dataLme) 
{ 
library(effects) 
library(lme4) 

fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), dataLme, 
     REML = 0, verbose = TRUE) 

plot(effect("Days",fm8)) 
} 

나는 오류를 얻었다.

Error in plot(effect("Days", fm8)) : 
    error in evaluating the argument 'x' in selecting a method for function 'plot': Error in is.data.frame(data) : object 'dataLme' not found 

하지만 수동으로

library(effects) 
library(lme4) 
fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), sleepstudy, 
    REML = 0, verbose = TRUE) 
plot(effect("Days",fm8)) 

를 실행하면 나는 어떤 오류가 발생하지 않았다.

나는 R 값으로 전달이 전체 개체 내용을 함수 인수로 복사한다고 생각했습니다. 그러나 내가 완전히 옳지 않은 것처럼 보입니다. 아무도 무슨 일이 일어나고 있는지 설명 할 수 있습니까?

+3

나는 문제가 의미를 전달하는 R의 주장이라고 생각하지 않습니다 ... 안정적 lme4 또는 nlme에 대한 개발lme4에 대한 eval(cl,envir=environment(formula(mod))) 작품 관련 eval(cl) 라인을 변경하지만, 내가 생각하는 문제는 effect'가'이다 모델 피팅 호출을 잘못된 위치에서 '평가'하려고합니다. 또는 적어도 함수 안에서 실행될 때 작동하지 않는 곳. – joran

+0

@RicardoSaporta 일. 오타를 유감스럽게 생각합니다. 나는 내 질문에 그것을 고쳤다. 감사! –

+0

@joran 알겠습니다. 어떻게 그렇게 빨리 알아 냈습니까? :-) 오, 잘. 나는 그 때 저자에게 연락 할 시간이다 것을 생각한다. 당신의 도움을 주셔서 감사합니다! –

답변

5

A는 (해키) 해결 방법은 effect()이 그것을 찾을 수있을 것입니다 지구 환경으로 dataLme를 할당하는 것입니다 : 이것은 단지 부분적인 대답은

library(effects) 
library(lme4) 

somefunc <- function (dataLme) { 
    ## Assign to a symbol that's unlikely to be in use in .GlobalEnv 
    ## (and make sure this function cleans up after itself!) 
    assign(".TeMpVaR", dataLme, envir=globalenv()) 
    on.exit(rm(.TeMpVaR, envir=globalenv())) 

    fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), .TeMpVaR, 
     REML = 0, verbose = TRUE)  
    plot(effect("Days",fm8)) 
} 

somefunc(sleepstudy) 
+0

우수! 고마워. –

+0

@ 토마스 - 방금 개선 된 솔루션으로 편집했습니다. –

+0

웬일인지, 새로운 업데이트에서 같은 오류가 발생합니다. –

2

,하지만 난 내 테스트 절차를 문서화 할 않았다 . 나는 주로이 문제가 lme4 패키지가 아닌 effects 패키지를 사용하고 있음을 보여주고 싶었습니다. (내가 유지 관리하고 있으며 이런 종류의 문제도 발생했습니다 : 대부분의 이러한 문제는 개발 버전 lme4에서 수정되었지만 , 오류는 우리가 안정 lme4 사용 여부를 발생합니다) ... 내 시스템에 lme4.0로 설치 안정 버전에서 개발 lme4, 또는 이전 nlme 패키지를

library("effects") 

showpkgs <- function() names(sessionInfo()$otherPkgs) 
somefunc<-function (dataLme, pkg="nlme") { 
    require(pkg,character.only=TRUE) 
    on.exit(detach(paste("package",pkg,sep=":"),unload=TRUE,character.only=TRUE)) 
    if (pkg=="nlme") { 
     fm8 <- lme(Reaction ~ 1 + Days,random=~Days|Subject, dataLme) 
    } else { 
     fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), dataLme, REML = 0) 
    } 
    plot(effect("Days",fm8)) 
} 

을 지속

data("sleepstudy",package="lme4") 
showpkgs() 
somefunc(sleepstudy) ## nlme 
showpkgs() ## warning about unloading nlme namespace due to glmmADMB dep. (??) 
somefunc(sleepstudy,pkg="lme4.0") ## lme4-stable 
showpkgs() ## failure to remove Matrix/warning message 
somefunc(sleepstudy,pkg="lme4") ## lme4-devel 
showpkgs() ## leaves RcppEigen, Rcpp loaded as well 

effects 패키지를 조금 훑어 보았고 간단한 보편적 인 수정이 즉시 명백하지 않습니다.