Benjamin Caldwell
2012-Mar-30 19:31 UTC
[R] avoiding expression evaluation when calling a function
Another question on functions - I have something that looks like plotter<-function(i){ temp.i<-rwb[rwb$vector1 <=(i*.10),] with(temp.i, plot(vector2, vector3, main=(i*.10),)) mod<-lm(vector3~vector3-1,data=temp.i) r2<-summary(mod)$adj.r.squared rsqrd[i]<-r2 legend("bottomright", legend=signif(r2), col="black") abline(mod) rsqrd<<-rsqrd } I'd rather not have to go into the function and re-type each vector and dataframe as I apply it to different vectors. My idea is something like: plotter<-function(i,frm,obj,x,y){ temp.i<-frm[frm$obj <=(i*.10),] with(temp.i, plot(x, y, main=(i*.10),)) mod<-lm(y~x-1,data=temp.i) r2<-summary(mod)$adj.r.squared rsqrd[i]<-r2 legend("bottomright", legend=signif(r2), col="black") abline(mod) rsqrd<<-rsqrd } However, it seems that when I do this the function is calling x, y from the global environment rather than simply passing the text and using the frame temp.i I create in the function. One idea I had was to go from read.csv to frm, obj entirely within the function, but that's about 110 lines of code each time. I'm hoping there's a way to have some of the expressions passed within the function without evaluation, in this case without calling data from the global environment. I've tried substitute(), plotter<-function(i,frm,obj,x,y){ temp.i<-frm[frm$obj <=(i*.10),] with(temp.i, plot(substitute(x), substitute(y), xlim=c(0,250), ylim=c(0,35), main=(i*.10),)) mod<-lm(substitute(y)~substitute(x)-1,data=temp.i) r2<-summary(mod)$adj.r.squared rsqrd[i]<-r2 legend("bottomright", legend=signif(r2), col="black") abline(mod) rsqrd<<-rsqrd } but am told "cannot coerce type 'symbol' to vector of type 'double'" Any suggestions appreciated. Thanks Ben [[alternative HTML version deleted]]
Joshua Wiley
2012-Mar-30 19:42 UTC
[R] avoiding expression evaluation when calling a function
Hi Benjamin, See inline On Fri, Mar 30, 2012 at 12:31 PM, Benjamin Caldwell <btcaldwell at berkeley.edu> wrote:> Another question on functions - I have something that looks like > > plotter<-function(i){ > temp.i<-rwb[rwb$vector1 <=(i*.10),] > ?with(temp.i, plot(vector2, vector3, main=(i*.10),)) > mod<-lm(vector3~vector3-1,data=temp.i) > ?r2<-summary(mod)$adj.r.squared > rsqrd[i]<-r2 > legend("bottomright", legend=signif(r2), col="black") > ?abline(mod) > rsqrd<<-rsqrd > } > > > I'd rather not have to go into the function and re-type each vector and > dataframe as I apply it to different vectors. My idea is something like: >Close, but pass a formula object. Something like (untested) plotter <- function(i, frm, obj, form){ temp.i<-frm[frm$obj <=(i*.10),] plot(form, main=(i*.10), data = temp.i) mod<-lm(form, data=temp.i) r2<-summary(mod)$adj.r.squared legend("bottomright", legend=signif(r2), col="black") abline(mod) return(rsqrd) } and I guess you are doing this for different values of i? so maybe rsqrd <- lapply(1:100, function(my.i) plotter(i = my.i, frm your_frm, obj = your_obj, form = y ~ x)) Hope this helps, Josh> plotter<-function(i,frm,obj,x,y){ > ?temp.i<-frm[frm$obj <=(i*.10),] > with(temp.i, plot(x, y, main=(i*.10),)) > ?mod<-lm(y~x-1,data=temp.i) > r2<-summary(mod)$adj.r.squared > rsqrd[i]<-r2 > ?legend("bottomright", legend=signif(r2), col="black") > abline(mod) > ?rsqrd<<-rsqrd > } > > However, it seems that when I do this the function is calling x, y from the > global environment rather than simply passing the text and using the frame > temp.i I create in the function. One idea I had was to go from read.csv to > frm, obj entirely within the function, but that's about 110 lines of code > each time. > > I'm hoping there's a way to have some of the expressions passed within the > function without evaluation, in this case without calling data from the > global environment. > > I've tried substitute(), > > plotter<-function(i,frm,obj,x,y){ > temp.i<-frm[frm$obj <=(i*.10),] > with(temp.i, plot(substitute(x), substitute(y), xlim=c(0,250), > ylim=c(0,35), main=(i*.10),)) > ?mod<-lm(substitute(y)~substitute(x)-1,data=temp.i) > r2<-summary(mod)$adj.r.squared > ?rsqrd[i]<-r2 > legend("bottomright", legend=signif(r2), col="black") > ?abline(mod) > rsqrd<<-rsqrd > } > but am told "cannot coerce type 'symbol' to vector of type 'double'" > > > Any suggestions appreciated. > > Thanks > > Ben > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.-- Joshua Wiley Ph.D. Student, Health Psychology Programmer Analyst II, Statistical Consulting Group University of California, Los Angeles joshuawiley.com