[R] passing arguments to functions within functions
Daniel E. Bunker
deb37 at columbia.edu
Wed Oct 17 19:12:34 CEST 2007
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)
More information about the R-help
mailing list