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)" <[EMAIL PROTECTED]> wrote: > > -----Original Message----- > > From: [EMAIL PROTECTED] > > [mailto:[EMAIL PROTECTED] 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 > > ______________________________________________ > [email protected] 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. > ______________________________________________ [email protected] 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.
