[R] Passing arguments to a function within a function ...

christiaan pauw cjpauw at gmail.com
Tue Aug 7 10:52:17 CEST 2012


Hallo Everybody

How do you specify arguments for a function used within another function?

Here is my problem:

I am reconstructing a calculator for the burden of disease due to air
pollution from publications and tools published by the WHO. The
calculations make use of published dose-response relationships for
particular health end-points. This is then applied to populations with
known or estimated levels of exposure and incidence rates to calcute
the number of cases of each end-point attributable to each pollutant.
I have functions that work on their own but when is have to use the
one within the other, I don't know how to specify its arguments

Here are example data and the functions:

########################################################
## Example data frame with population, concentration and cases ##

x = data.frame(Name = LETTERS[1:10],
               pop=sample(x=1000:10000,size=10),
               Xbabies = 0.106,
               Xkids = 0.232,
               Xteens = 0.375,
               Xadults = 0.235,
               Xaged = 0.52,
               cases = sample(x=100:500,size=10),
               conc = sample(x=20:125,size=10)
               )

## Two of the published dose-response relationships

adult.CP.mortality = list(end.point = "Cardiopulmanory mortality in
adults over 30",
                          pollutant = "PM10",
                          relationship = "log-linear",
                          beta = c(0.0562,0.1551,0.2541),
                          Xpop =
c("Xbabies","Xkids","Xteens","Xadults","Xaged")[4:5])

adult.LC.mortality = list(end.point = "Lung Cancer mortality in adults over 30",
                          pollutant = "PM10",
                          relationship = "log-linear",
                          beta = c(0.0856, 0.2322,0.3787),
                          Xpop =
c("Xbabies","Xkids","Xteens","Xadults","Xaged")[4:5])

## Generic function to calculculate the Attributable cases for a
pollutant in a population
dose.response <- function(pop,
                          Xpop = 1,
                          conc,
                          base.conc=7.5,
                          relationship = c("linear","log-linear")[1],
                          beta=c(0.0006,0.0008,0.0010),
                          cases=NULL,
                          incidence.rate=NULL,
                          par = c("low estimate","cental
estimate","high estimate"),
                          verbose = FALSE
                          ){
  # Turn case rate into case number
  d <- cases
  if(verbose==TRUE) message("d = ", d)
  if(verbose==TRUE) message("pop = ", pop)
  if(verbose==TRUE) message("beta = ", beta)
  if(verbose==TRUE) message("conc = ", conc)
  if(verbose==TRUE) message("base.coc = ", base.conc)
  if(verbose==TRUE) message("relationship = ", relationship)
  if(is.null(cases)==TRUE) {d <- incidence.rate*pop} # use incidence
rate if cases are not available
  if(relationship == "linear") {RR = exp(beta*(conc-base.conc))}
#RR=exp[beta(X-Xo)]
  if(relationship == "log-linear") {RR = ((conc+1)/(base.conc+1))^beta}
  if(verbose==TRUE) message("RR = ", RR)
  AF =  (RR-1)/RR  #AF=(RR-1)/RR
  if(verbose==TRUE) message("AF = ", AF)
  AM =  AF * d #AM = AF * cases
  if(verbose==TRUE) message("AM = ", AM)
  out = data.frame(beta=beta,cases=d,
                   RelativeRisk=RR,AttributableFraction=AF,
                   AttributableInsidence=AM)
  rownames(out) = c("low estimate","cental estimate","high estimate")
  if(verbose==TRUE) message("dimentions of out  = ", dim(out))
  out.idx = na.omit(match(par,rownames(out)))
  out[out.idx,]
}

## Function using the  published dose-response relationships with the
generic function
drep <- function(pop.conc=x,sicklist=adult.CP.mortality,...){
  dr.out=by(x,x$Name,function(x){z=as.data.frame((x))

dose.response(pop=z$pop*sum(z[,adult.CP.mortality$Xpop]),
                                              conc=z$conc,
                                              cases=z$cases,
                                              relationship =
sicklist$relationship,
                                              beta = sicklist$beta,
                                              Xpop = sicklist$Xpop,
                                              par = c("low
estimate","cental estimate","high estimate")[2]
                                              , verbose=FALSE
                                              )
} )
  names(dr.out) <- paste(sicklist$end.point,": ", names(dr.out),sep="")
  dr.out
}

#####################################################

This is where the trouble starts: What do I do if I need to pass the
argument base.conc=10 or a different option for par= to
dose.response() ? At the moment it works becuase it uses the default,
which will not be valid in all cases.

Thanks in advance
Christiaan


--
Christiaan Pauw
Nova Institute
www.nova.org.za



More information about the R-help mailing list