[R] Function call within a function.

Nordlund, Dan (DSHS/RDA) NordlDJ at dshs.wa.gov
Thu Jun 28 23:08:08 CEST 2007


> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch 
> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of John Kane
> Sent: Thursday, June 28, 2007 12:04 PM
> To: R R-help
> Subject: [R] Function call within a function.
> 
> I am trying to call a funtion within another function
> and I clearly am misunderstanding what I should do. 
> Below is a simple example.
> I know lstfun works on its own but I cannot seem to
> figure out how to get it to work within ukn. Basically
> I need to create the variable "nts". I have probably
> missed something simple in the Intro or FAQ.
> 
> Any help would be much appreciated.
> 
> EXAMPLE
> --------------------------------------------------------------
> -----------------
> # create data.frame
> cata <- c( 1,1,6,1,1,4)
> catb <- c( 1,2,3,4,5,6)
> id <- c('a', 'b', 'b', 'a', 'a', 'b')
> dd1  <-  data.frame(id, cata,catb)
> 
> # function to create list from data.frame
> lstfun  <- function(file, alpha , beta ) {
> cda  <-  subset(file, file[,1] == alpha)
> cdb  <-  subset (file, file[,1]== beta)
> list1 <- list(cda,cdb)
> }
> 
> # funtion to operate on list
> ukn  <-  function(file, alpha, beta, nam1){
> aa  <- alpha
> bb  <- beta
> myfile  <- file
> nts <- lstfun(myfile, aa, bb)
> mysum <- nam1[,3]*5
> return(mysum)
> }
> 
> results <- ukn(dd1, "a", "b", nts$cda)

John,

The first problem I see is one of scope.  nts$cda refers to an object called nts which does not exist in the calling environment (it is local to the function ukn).  So trying to call ukn() with nts results in an error.  Second, even if you pass the name of the object, you will not be able to use it in ukn() in the manner that you are trying.  Your ukn() function definition also requires that it know the inner workings of function lstfun().  Functions generally shouldn't require knowing how other functions work, they should only rely on what value is returned.

You can get what you want by redefining ukn in the following way

# funtion to operate on list
ukn  <-  function(file, alpha, beta, nam1){
aa  <- alpha
bb  <- beta
myfile  <- file
nts <- lstfun(myfile, aa, bb)
mysum <- nts[[nam1]][,3]*5
return(mysum)
}

And change the function call to

results <- ukn(dd1, "a", "b", 1) 

This still leaves the functions coupled in a way that I don't like, but I'm not a good enough R programmer to solve that problem at the moment.  Maybe someone else will come along with a better solution.

Hope this is helpful,

Dan

Daniel J. Nordlund
Research and Data Analysis
Washington State Department of Social and Health Services
Olympia, WA  98504-5204



More information about the R-help mailing list