[R] Function call within a function.

Jason Barnhart jasoncbarnhart at msn.com
Thu Jun 28 23:40:36 CEST 2007


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.

----- Original Message ----- 
From: "John Kane" <jrkrideau at yahoo.ca>
To: "R R-help" <r-help at stat.math.ethz.ch>
Sent: Thursday, June 28, 2007 12:03 PM
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)
>
> ______________________________________________
> 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