2013-04-08 12 views
5

Aktualizacja: Poprzedni tytuł był Is there any specific way to pass data frame as an argument to a function?, ale to nie było właściwe pytanie według genialnych gości tutaj. Oryginalny wpis znajduje się poniżej.Jak uruchomić efekt wykresu wewnątrz funkcji R

Kiedy wpadłem następujących funkcji z 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)) 
} 

mam błąd.

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 

Ale jeśli ręcznie wykonany

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

nie dostałem żadnego błędu.

Myślałem, że R przechodzi przez wartość oznaczającą skopiowanie całej treści obiektu do argumentu funkcji. Ale wygląda na to, że nie miałem do końca racji. Czy ktoś może wyjaśnić, co się dzieje?

+3

Nie sądzę, że problem jest argumentem za przepuszczanie R semantykę, myślę, że problemem jest to, że jest 'effect' próbuje "eval" model dopasowania połączenia w niewłaściwym miejscu. Lub przynajmniej miejsce, które powoduje, że nie działa po uruchomieniu wewnątrz funkcji. – joran

+0

@RicardoSaporta Days. Przepraszamy za literówki. Naprawiłem to w moim pytaniu. Dzięki! –

+0

@joran Widzę. Jak szybko to zrozumiałeś? :-) No cóż. Chyba nadszedł czas, aby skontaktować się z autorem. Dzięki za pomoc! –

Odpowiedz

5

A (hacky) Rozwiązaniem jest przypisanie dataLme w globalnym środowisku, gdzie effect() będą mogli go znaleźć:

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

Excellent! Wielkie dzięki. –

+0

@Thomas - Właśnie edytowałem z ulepszonym rozwiązaniem. –

+0

Z jakiegoś powodu otrzymuję ten sam błąd z nową aktualizacją. –

2

Jest to tylko częściowa odpowiedź, ale chciał udokumentować moje procedury testowania . Chciałem przede wszystkim pokazać, że problem dotyczy przede wszystkim pakietu effects, a nie pakietu lme4 (który utrzymuję i który napotkał również na tego rodzaju problemy: większość takich problemów została naprawiona w wersji rozwojowej lme4, ale niektóre utrzymują się w stabilnej wersji, zainstalowanej jako lme4.0 na moim systemie ...)

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)) 
} 

błąd występuje, czy używamy stabilny lme4, rozwój lme4 lub starszej nlme pakiet

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 

Zrobiłem mały rzut oka na pakiet effects, a prosta uniwersalna poprawka nie jest od razu oczywista. Zmiana stosownych eval(cl) linie do eval(cl,envir=environment(formula(mod))) prac dla rozwojulme4, ale nie dla stabilnego lme4 lub nlme ...