[R] Function call within a function.

John Kane jrkrideau at yahoo.ca
Fri Jun 29 14:54:46 CEST 2007


Thanks very much.  A very nice solution.  The
environment problem was the result of one last
deperate try when the actual problem as Jason pointed
out was that I was not naming my list elements and
thought that I had.  

This looks like it will work quite nicely. I am pretty
sure that there is a cleaner way to do this but it is
likely to mean too much manipulation of data earlier
on.  This is a small attempt to extract data in a new
way from a larger project. 

This is greatly appreciated.

 
--- "Nordlund, Dan (DSHS/RDA)" <NordlDJ at dshs.wa.gov>
wrote:

> > -----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
> 
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
>



More information about the R-help mailing list