Hi, I have a large dataframe than I'm writing functions to explore, and to reduce cut and paste I'm trying to write a function that does a subset and then a plot.
Firstly, I can write a wrapper around a plot: plotwithfits <- function(formula, data, xylabels=c('','')) { xyplot(formula, data, panel = function(x,y, ...) { panel.xyplot(x,y, ...) panel.abline(lm(y~x),lwd=2, ...) panel.loess(x,y,lwd=2,col.line='red', ...) }, xlab = xylabels[1], ylab= xylabels[2]) } plotwithfits(Latency ~ Stimulus.number | Subject.ID,eye_subsetted_data) # Works However, I can't get it working if I try the same for a subset and plot: explorebysubject <- function(xvar,yvar,data,condition=TRUE,xlim=c(-Inf,Inf),ylim=c(-Inf,Inf)) { temp_subset <- subset(data, subset=condition&xvar>xlim[1]&xvar<xlim[2]&yvar>ylim[1]&yvar<ylim[2], select=c(Group,Subject.ID,xvar,yvar) ) plotwithfits(xvar~yvar | Subject.ID,temp_subset) } explorebysubject(Latency,Primary.gain,eye,Analysis.type == 'reflexive') # Doesn't work as can't find 'Analysis.type', 'Latency', etc I can see why it doesn't work, however, I've looked at substitute, deparse, etc, without much luck. Is there a something simple I could do to fix this up? Is there any material I should be reading? Using the arguments eye$Latency, eye$Primary.gain, etc would partially solve this problem, however I would prefer to avoid this if possible. One unclean way that does work is constructing strings and then evaluating them. However, as I am planning to write several similar functions I would prefer to avoid this: explorebysubject <- function(xvar,yvar,dataset,condition,xlim=c(-Inf,Inf),ylim=c(-Inf,Inf)) { # xvar - variable to plot along x-axis # yvar - variable to plot along y-axis # the dataset to use # condition - used to provide extra conditions on the data selected # xlim, ylim - optional limits of data to select. i.e. xlim=c(0,1) # Generate command to select appropriate data cmd <- paste("subset(",dataset,",",condition,"&",xvar,">",xlim[1],"&",xvar,"<",xlim[2],"&",yvar,">",ylim[1],"&",yvar,"<",ylim[2],",select=c(",xvar,",",yvar,",Group,Subject.ID))") temp_subset <- eval(parse(text=cmd)) #generate plot command cmd <- paste("plotwithfits(",xvar,"~",yvar,"|Subject.ID,temp_subset)") eval(parse(text=cmd)) } explorebysubject('Latency','Primary.gain','eye',"Analysis.type == 'reflexive'",xlim=c(90,500),ylim=c(0.5,1.5)) # Works Thanks. Cheers, Daniel ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.