> -----Original Message----- > From: r-help-boun...@r-project.org > [mailto:r-help-boun...@r-project.org] On Behalf Of Nordlund, > Dan (DSHS/RDA) > Sent: Thursday, December 18, 2008 5:00 PM > To: r-help@r-project.org > Subject: Re: [R] understanding recursive functions > > > -----Original Message----- > > From: r-help-boun...@r-project.org > > [mailto:r-help-boun...@r-project.org] On Behalf Of > > ted.hard...@manchester.ac.uk > > Sent: Thursday, December 18, 2008 2:52 PM > > To: r-help@r-project.org > > Cc: joseph.g.bo...@gsk.com > > Subject: Re: [R] understanding recursive functions > > > > On 18-Dec-08 22:33:28, Jeffrey Horner wrote: > > > joseph.g.bo...@gsk.com wrote on 12/18/2008 04:22 PM: > > >> I'm trying to understand the use of recursive functions described > > >> on page 45 of An Introduction to R by the R core > development team. > > >> > > >> A function is a list of expressions, which all get executed with > > >> only the last being assigned to a global variable, right? > > >> So if a function refers recursively to itself, it should simply > > >> start with the first expression and go from there. At least that > > >> is my understanding of why the example given on page 45 works. > > >> > > >> In light of the above, I would appreciate it if someone would > > >> understand why the following example does not work: > > >> > > >> q <- function(x,h) {if (x < 2) {x <<- x+1; return(q(x))} else > > >> return(x)} > > >> > > >> If x < 1, this should add 1 to x and go back to the beginning of > > >> the if expression, and the final result should be 2. So > q(0) should > > >> return 2. > > >> But it returns an error message. > > > > > > All references to x save one (the assignment with the <<- > operator) > > > are found within the current frame, not by lexical scoping, and > > > hence is never changed... producing infinite recursion. The > > following > > > at least fixes your example: > > > > > > q <- function(x,h) {if (x < 2) {x <<- x+1; x <- x+1; > > return(q(x))} else > > > return(x)} > > > ls() # no x in global env just yet > > > q(-10) > > > ls() > > > > The following fixes it even more simply (using the same principles): > > > > q <- function(x,h){ > > if (x < 2) {u <- x+1; return(q(u))} else return(x) > > } > > > > Note that "<<-" is not necessary. > > > > Just to test the method more thoroughly: > > > > q <- function(x,h){ > > if (x < 2) {u <- x+h; return(q(u,h))} else return(x) > > } > > > > q(0,0.3) > > # [1] 2.1 > > > > Ted. > > > > I am by no means an expert in programming so I will defer to > the experts. But assuming the OP was not intentionally trying > to assign in a parent environment, couldn't the above > function be written as > > q <- function(x,h){if (x < 2) q(x+h,h) else return(x)
Sorry, I forgot the final '}' . Or I think you can eliminate the leading '{' and final '}' in this case. q <- function(x,h) {if (x < 2) q(x+h,h) else return(x)} > > Hope this is helpful, > > Dan > > Daniel J. Nordlund > Washington State Department of Social and Health Services > Planning, Performance, and Accountability > Research and Data Analysis Division > Olympia, WA 98504-5204 > > > > ______________________________________________ > R-help@r-project.org 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@r-project.org 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.