[R] Using update() within a function with a changed formula
Wolfgang Viechtbauer
wo||g@ng@v|echtb@uer @end|ng |rom m@@@tr|chtun|ver@|ty@n|
Sat Nov 13 21:14:31 CET 2021
Perfectly clear. Thanks!
Best,
Wolfgang
On Sat, 13 Nov 2021, Duncan Murdoch wrote:
> On 13/11/2021 2:24 p.m., Viechtbauer, Wolfgang (SP) wrote:
>> Hello all,
>>
>> Say I would like to change the outcome in a formula to a variable not part
>> of the original dataset. This works just fine:
>>
>> res <- lm(mpg ~ wt + cyl, data=mtcars)
>> res
>> y <- rnorm(nobs(x))
>> update(x, formula = y ~ .)
>>
>> But not when doing so within a function:
>>
>> rm(y)
>>
>> f <- function(x) {
>> y <- rnorm(nobs(x))
>> update(x, formula = y ~ .)
>> }
>>
>> f(res)
>>
>> Is there a way to make this work? Using y <<- ... inside the function
>> works, but I would like to avoid such a heavy-handed approach.
>
> Formulas have associated environments, and that's where functions using them
> look for variables. update() leaves the formula environment unchanged, as
> documented in ?update.formula. Since yours started out as globalenv(), you
> would need to put y there, and that's what you want to avoid.
>
> However, the default update() method (the one you call on res, that calls the
> formula method) allows you to change other things.
>
> So you could do it this way:
>
> res <- lm(mpg ~ wt + cyl, data=mtcars)
>
> f <- function(x) {
> y <- rnorm(nobs(x))
> newdata <- cbind(model.frame(x), y)
> update(x, formula = y ~ ., data = newdata)
> }
> f(res)
>
> Duncan Murdoch
More information about the R-help
mailing list