Re: [R] Function call within a function.

From: Jason Barnhart <jasoncbarnhart_at_msn.com>
Date: Thu, 28 Jun 2007 14:40:36 -0700

The problem isn't the function call.

First, list1 returned by lstfun does not name its elements so nts$cda won't work. See code change in lstfun.

Second, specifying nts$cda as the nam1 argument tells R to look for the nts object in the environment in which ukn is called. However, the nts object is not created in the parent environment, it is created in the ukn's environment.

Third, nam1[,3] should be nam1[2] as there is no third element to this list (although and this doesn't resolve the environment issue).

I've modified your code below to work, but there are better ways to go about this. Thomas Lumley has a famous quote regarding parse. See http://tolstoy.newcastle.edu.au/R/e2/help/07/01/8059.html among others.

I was once referred to Patrick Burns' S Poetry to learn about the "eval(parse(text=)))" paradigm which was very helpful. You may also want to brush up on environments (see ?environment) to learn more about lexical scoping.

Hope this helps.
-jason

#MODIFIED CODE
# 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)
### CODE ADDED HERE
list1 <- list(cda=cda,cdb=cdb)
}

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

results <- ukn(dd1, "a", "b", "nts$cda") ### modified how called.

>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)
>
> ______________________________________________
> 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.
>



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. Received on Thu 28 Jun 2007 - 22:42:51 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 29 Jun 2007 - 13:32:37 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.