[R] Function call within a function.

John Kane jrkrideau at yahoo.ca
Fri Jun 29 14:41:18 CEST 2007


--- Jason Barnhart <jasoncbarnhart at msn.com> wrote:

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

I missed that entirely.  I was groggier than I
realised yesterday afternoon. I had at least once left
nts in existance in the same environment where ukn is
called, thus getting an intermitant error. In that
environment nts$cda was named!

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

Yes.  I had already tried calling it within the ukn
environment not realising that I had not named the
elements so this was my last try.  

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

Oops, typo when creating the simple example.  Sorry. 
> 
> 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

This has been very helpful though I still do not
understand why one must call nts$cda using the
eval(parse()) command.  Is it because nts is created
within the ukn environment?  

I have had a look at S-Poetry but will need to spend a
lot more time on this.  

I thought that this was not the best way to do things
but I wanted to avoid doing a lot of earlier
manipulations to my data files and so decided to go
with what I had. 


> 
> #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