thanks! using update( ) in a function?
Thank you very much for your suggestion. mahmood arai
Thomas Lumley wrote:
On Mon, 21 Apr 2003, Roger Peng wrote:
I believe this is bug PR#1861. Not sure what the workaround is.
No, the code as given doesn't get as far as that
On Mon, 21 Apr 2003, Mahmood ARAI wrote:
Hello,
using the function "update()" in the following function
does not work.
# a function for running a model: x1 ~ x2
# by updating the original model: fm1 <- lm(y ~ x1 + x2,data=df)
# update(fm1, x1 ~ . -x1, data=df) works at the command line
# but not in the function below.
R> foo <- function(fm,x,df)
+ {
+ update(fm, x ~ . -x,data=df)
+ }
R>
R>
R> df1 <- data.frame(y= 1:10, x1=(1:10)^2, x2=sqrt(1:10)^3)
R> fm1 <- lm(y ~ x1+x2, data=df1)
R>
R> foo(fm1, x1, df1)
Error in eval(expr, envir, enclos) : Object "x" not found
The main problem here is that the argument `x' is only going to have the *value* of x1, where you need the symbol x1. On top of that, update(fm, x ~ . -x,data=df) uses the symbol `x' rather than its value, so even if its value were correct it wouldn't work. This works
foo<-function(model,term,data){
+ ff<-substitute(term~.-term) + update(model,ff,data=data) + }
data(trees) a<-lm(Girth~Height+Volume,data=trees) foo(a,Height,data=trees)
Call: lm(formula = Height ~ Volume, data = data) Coefficients: (Intercept) Volume 69.0034 0.2319 but is not recommended style, as you are defeating the call-by-value semantics of R. A better version is
bar<-function(model,term,data){
+ ff<-substitute(x~.-x,list(x=as.name(term))) + update(model,ff,data=data) + }
bar(a,"Height",data=trees)
Call: lm(formula = Height ~ Volume, data = data) Coefficients: (Intercept) Volume 69.0034 0.2319 and you could have versions that allowed `term' to be a quoted name or expression rather than a string. -thomas