update () wewnątrz funkcji przeszukuje tylko środowisko globalne?

Próbowałem napisać funkcję opakowującą, aby wykonać testy współczynnika wiarygodności w partiach. Próbowałem dołączyć aktualizację (), aby zaktualizować model początkowy. Wydaje się jednak, że zamiast szukać obiektów wewnątrz funkcji, wyszukuje obiekty w środowisku globalnym.

fake <- data.frame(subj= rep(1:5, 4), 
                   factor1 = rep(LETTERS[c(1,2,1,2)], each=5), 
                   factor2 = rep(letters[1:2], each=10), 
                   data=sort(rlnorm(20)))

foo <- function(){
                  temp <- fake
                  model1 <- lmer(data~factor1*factor2 + (1 |subj), temp)
                  model1a <- update(model1, ~.-factor1:factor2)
                  model1a}

I daje poniżej komunikat o błędzie:

Error in eval(expr, envir, enclos) : object 'factor1' not found

Czy mimo to należy wykonać aktualizację () w obrębie funkcji? Dziękuję Ci!

EDYTOWAĆ:

Popełniłem błąd. Chciałem przekazać „temp” lmerowi, a nie „fałszywemu”.

EDIT2: Jednym z wygodnych rozwiązań sugerowanych jest po prostu określenie obiektu danych. Chociaż update () teraz nie ma z tym problemu, anova () wydaje się myśleć, że modele, które próbuję porównać, są oparte na różnych obiektach danych

 foo <- function(){
                  temp <- fake
                  model1 <- lmer(data~factor1*factor2 + (1 |subj), data=temp)
                  model1a <- update(model1, ~.-factor1:factor2, data=temp)
                  anova(model1, model1a)
            }
 foo()

Otrzymuję komunikat o błędzie:

 Error in anova(model1, model1b) : 
   all models must be fit to the same data object

Przypuszczam, że ten błąd wykracza poza aktualizację (). Ale zastanawiam się, czy ktoś wie, jak można to rozwiązać. Zauważ, że jeśli piszę funkcję bez użycia update () i zamiast tego przeliteruję modele (patrz poniżej), powyższy błąd zniknie:

 foo <- function(){
                  temp <- fake
                  model1 <- lmer(data~factor1*factor2 + (1 |subj), data=temp)
                  model1a <- lmer(data~factor1 + factor2 + (1 |subj), data=temp)
                  anova(model1, model1a)
            }
 foo()

 Data: temp
 Models:
 model1a: data ~ factor1 + factor2 + (1 | subj)
 model1: data ~ factor1 * factor2 + (1 | subj)
         Df     AIC    BIC  logLik  Chisq Chi Df Pr(>Chisq)  
 model1a  5 -4.6909 3.7535  7.3454                           
 model1   6 -8.8005 1.3327 10.4003 6.1097      1    0.01344 *
 ---
 Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

EDYCJA 3: Wydaje się, że problem dotyczy anova (). Spróbowałem również sugestii @hadley

foo2 <- function(){
  my_update <- function(mod, formula = NULL, data = NULL) {
  call <- getCall(mod)
  if (is.null(call)) {
    stop("Model object does not support updating (no call)", call. = FALSE)
  }
  term <- terms(mod)
  if (is.null(term)) {
    stop("Model object does not support updating (no terms)", call. = FALSE)
  }
  if (!is.null(data)) call$data <- data
  if (!is.null(formula)) call$formula <- update.formula(call$formula, formula)
  env <- attr(term, ".Environment")
  eval(call, env, parent.frame())}

      model1 <- lmer(data~factor1*factor2 + (1 |subj), temp)
      model1a <- my_update(model1, ~.-factor1:factor2)
      anova(model1, model1a)
 }
 foo2()

Dostałem komunikat o błędzie, jak pokazano poniżej:

 Error in as.data.frame.default(data) : 
   cannot coerce class 'structure("mer", package = "lme4")' into a data.frame

questionAnswers(2)

yourAnswerToTheQuestion