[R] Function call within a function.
John Kane
jrkrideau at yahoo.ca
Fri Jun 29 14:54:46 CEST 2007
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)" <NordlDJ at dshs.wa.gov>
wrote:
> > -----Original Message-----
> > From: r-help-bounces at stat.math.ethz.ch
> > [mailto:r-help-bounces at stat.math.ethz.ch] 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
>
> ______________________________________________
> 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