Daniel E. Bunker
2007-Oct-17 16:35 UTC
[R] passing arguments to functions within functions
Dear R Users, I am trying to write a wrapper around summarize and xYplot from Hmisc and am having trouble understanding how to pass arguments from the function I am writing to the nested functions. There must be a way, but I have not been able to figure it out. An example is below. Any advice would be greatly appreciated. Thanks, Dan # some example data df=expand.grid(rep=1:4, fac1=c("a","b"), fac2=c("c","d"), fac3=c ("e","f")) df$resp1=rnorm(length(df$fac1)) df # define a funciton to compute mean, std error and n. meanstderr <- function(x) c(Mean=mean(x,na.rm=TRUE),se=sqrt(var (x,na.rm=TRUE)/length(na.omit(x))), n=length(na.omit(x))) # what I want to wrap into a single funtction: sumdf=with(df, summarize(X=resp1, by=llist(fac1, fac2, fac3), stat.name="resp1", FUN=meanstderr)) xYplot(Cbind(resp1, resp1-se, resp1+se) ~ as.numeric(fac1)|fac2, groups=fac3, data=sumdf, type='b', scales=list(x=list(labels=levels(df$fac1), at=1:length(levels(df $fac1)))), xlim=c(0,length(levels(df$fac1))+1)) # here is a function to make the call to "summarize", but I cannot understand how to pass the arguments to "summarize" # I've tried passing them as names, text and vectors, but to no avail xYerrbar=function(formula, data = sys.frame(sys.parent()), groups, subset, xlab = NULL, ylab = NULL, ylim = NULL, panel = panel.xYplot, prepanel = prepanel.xYplot, scales = NULL, minor.ticks = NULL, ...) { # data=df; groups=fac2 require("Hmisc") require("grid") require("lattice") ytext <- as.character(formula[2]) yvname <- formula[[2]] y <- eval(parse(text = ytext), data) xexp <- formula[[3]] if (length(xexp) > 1 && as.character(xexp[[1]]) == "|") { xvname <- xexp[[2]] byname <- xexp[[3]] xtext <- as.character(xexp[2]) bynametext <- as.character(xexp[3]) } else {xvname <- xexp; xtext <- as.character(xexp)} xv <- eval(xvname, data) byfac <- eval(byname, data) if (!missing(groups)) {groups <- eval(substitute(groups), data)} # none of the below seem to work sumdf1=do.call("summarize", args=list(X=y, by=llist(xvname), FUN=meanstderr)) sumdf2=do.call("summarize", args=list(X=y, by=xv, FUN=meanstderr)) sumdf4=summarize(y, by=llist(xv), FUN=meanstderr) } xYerrbar(formula=resp1~fac2|fac1, data=df, groups=fac3) [[alternative HTML version deleted]]
Daniel E. Bunker
2007-Oct-17 17:12 UTC
[R] passing arguments to functions within functions
Dear R Users, I am trying to write a wrapper around summarize and xYplot from Hmisc and am having trouble understanding how to pass arguments from the function I am writing to the nested functions. There must be a way, but I have not been able to figure it out. An example is below. Any advice would be greatly appreciated. Thanks, Dan # some example data df=expand.grid(rep=1:4, fac1=c("a","b"), fac2=c("c","d"), fac3=c ("e","f")) df$resp1=rnorm(length(df$fac1)) df # define a funciton to compute mean, std error and n. meanstderr <- function(x) c(Mean=mean(x,na.rm=TRUE),se=sqrt(var (x,na.rm=TRUE)/length(na.omit(x))), n=length(na.omit(x))) # what I want to wrap into a single funtction: sumdf=with(df, summarize(X=resp1, by=llist(fac1, fac2, fac3), stat.name="resp1", FUN=meanstderr)) xYplot(Cbind(resp1, resp1-se, resp1+se) ~ as.numeric(fac1)|fac2, groups=fac3, data=sumdf, type='b', scales=list(x=list(labels=levels(df$fac1), at=1:length(levels(df $fac1)))), xlim=c(0,length(levels(df$fac1))+1)) # here is a function to make the call to "summarize", but I cannot understand how to pass the arguments to "summarize" # I've tried passing them as names, text and vectors, but to no avail xYerrbar=function(formula, data = sys.frame(sys.parent()), groups, subset, xlab = NULL, ylab = NULL, ylim = NULL, panel = panel.xYplot, prepanel = prepanel.xYplot, scales = NULL, minor.ticks = NULL, ...) { # data=df; groups=fac2 require("Hmisc") require("grid") require("lattice") ytext <- as.character(formula[2]) yvname <- formula[[2]] y <- eval(parse(text = ytext), data) xexp <- formula[[3]] if (length(xexp) > 1 && as.character(xexp[[1]]) == "|") { xvname <- xexp[[2]] byname <- xexp[[3]] xtext <- as.character(xexp[2]) bynametext <- as.character(xexp[3]) } else {xvname <- xexp; xtext <- as.character(xexp)} xv <- eval(xvname, data) byfac <- eval(byname, data) if (!missing(groups)) {groups <- eval(substitute(groups), data)} # none of the below seem to work sumdf1=do.call("summarize", args=list(X=y, by=llist(xvname), FUN=meanstderr)) sumdf2=do.call("summarize", args=list(X=y, by=xv, FUN=meanstderr)) sumdf4=summarize(y, by=llist(xv), FUN=meanstderr) } xYerrbar(formula=resp1~fac2|fac1, data=df, groups=fac3)