Skip to content
Back to formatted view

Raw Message

Message-ID: <07E9E8CD-3B1A-440D-932B-F5E522FF5CF5@comcast.net>
Date: 2012-09-17T22:55:18Z
From: David Winsemius
Subject: "eval" inside a function call in connection with updating the data slot in the call of lmer
In-Reply-To: <7E8037094A0C2146AA3E6F94DAE621C3444358C0@AD-EXCHMBX2-3.aau.dk>

On Sep 17, 2012, at 3:26 PM, S?ren H?jsgaard wrote:

> Dear list,
> Given a linear mixed model (from lme4) I want to 1) first change the input dataset and then 2) change the model formula. I want this to happen in a function call; 
> Please see below. Options 1) and 2) below work whereas 3) fails with the message 
>> foo()
> Error in is.data.frame(data) : object 'beets2' not found
> 
> Question: What is it one must to in case 3) to have R look "inside" the function to figure out what "beets2" is?

That will depend on how you offer that 6 letter sequence to the interpreter. Surrounded by quotes will be quite different than without quotes
> 
> Best regards 
> S?ren
> ________________
> 
> library(pbkrtest)
> data(beets)
> lgs    <- lmer(sugpct~block+sow+harvest+(1|block:harvest), data=beets, REML=F)
> 
> foo <- function(){
> 	## 1)
> 	beets2 <- transform(beets, yy = sugpct * yield)
> 	ma1    <- lmer(yy~block+sow+harvest+(1|block:harvest), data=beets2, REML=F)
> 	ma0    <- update(ma1, yy~.)
> 	## 2)
> 	cl <- getCall(lgs)
> 	cl[["data"]] <- beets2
> 	mb1 <- eval(cl)
> 	mb0 <- update(mb1, yy~.)
> 	mb0
> 	## 3)
> 	cl <- getCall(lgs)
> 	cl[["data"]] <- as.name("beets2")

The problem here is that 'beets2' is just a character vector ...  with no binding.

I'm wondering if you instead want:
          cl[["data"]] <-  get("beets2")

> 	mc1 <- eval(cl)
> 	mc0 <- update(mc1, yy~.)
> 	mc0
> }
> foo()

No guarantees. I'm not a particularly experienced surgeon of lmer-objects.

> 
-- 

David Winsemius, MD
Alameda, CA, USA