Skip to content

"eval" inside a function call in connection with updating the data slot in the call of lmer

3 messages · Søren Højsgaard, David Winsemius, Duncan Murdoch

#
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
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?

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")
	mc1 <- eval(cl)
	mc0 <- update(mc1, yy~.)
	mc0
}
foo()
#
On Sep 17, 2012, at 3:26 PM, S?ren H?jsgaard wrote:

            
That will depend on how you offer that 6 letter sequence to the interpreter. Surrounded by quotes will be quite different than without quotes
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")
No guarantees. I'm not a particularly experienced surgeon of lmer-objects.
#
On 12-09-17 6:26 PM, S?ren H?jsgaard wrote:
I get the failure in 1), not in 3).  I think it's a bug.  The problem 
appears to be that the update method for mer objects looks in the wrong 
place for its variables.  It is looking in parent.frame() (i.e. in the 
caller), but the caller isn't you.  The method should be looking in 
parent.frame(2).

You can fix this yourself if you have the lme4 source (it's line 1483 of 
lmer.R in version 0.999999-0) but you probably want to send your sample 
code to the maintainers.  Making that change might break something else.

Duncan Murdoch