[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