Here is the same issue in a simpler form: > f <- function(x) log(return(x)) > f(10) [1] 10 f's 'x' is returned before log does anything with it.
Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > -----Original Message----- > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On > Behalf > Of William Dunlap > Sent: Tuesday, September 10, 2013 12:59 PM > To: Jonathan Greenberg; r-help > Subject: Re: [R] ifelse question (I'm not sure why this is working)... > > > remainderFunction<-function(x,d) > > { > > ifelse(x%%d==0,yes=return(which(x%%d==0)),no=return(NULL)) > > } > > remainderFunction(x=c(23:47),d=3) > > The above call returns c(2, 5, 8, 11, 14, 17, 20, 23), the value of > (23:47)%%3. > Note that remainderFunction(integer(0), 3) returns logical(0). > > The return() calls in the call to ifelse cause the problem. The one used > for the second argument to ifelse causes remainderFunction to return, > abandoning the evaluation of ifself, as soon as ifelse evaluates its second > argument. > > I think that using return this way is bad practice, but have seen it in code > like > tryCatch(return(something), > error=function(e)"Error in something") > which is common in support code for RStudio. > > Bill Dunlap > Spotfire, TIBCO Software > wdunlap tibco.com > > > > -----Original Message----- > > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On > > Behalf > > Of Jonathan Greenberg > > Sent: Tuesday, September 10, 2013 12:40 PM > > To: r-help > > Subject: [R] ifelse question (I'm not sure why this is working)... > > > > R-helpers: > > > > One of my intrepid students came up with a solution to a problem where > > they need to write a function that takes a vector x and a "scalar" d, > > and return the indices of the vector x where x %% d is equal to 0 (x > > is evenly divisible by d). I thought I had a good handle on the > > potential solutions, but one of my students sent me a function that > > WORKS, but for the life of me I can't figure out WHY. Here is the > > solution: > > > > remainderFunction<-function(x,d) > > { > > ifelse(x%%d==0,yes=return(which(x%%d==0)),no=return(NULL)) > > } > > remainderFunction(x=c(23:47),d=3) > > > > I've never seen an ifelse statement used that way, and I was fully > > expecting that to NOT work, or to place the output of which(x%%d==0) > > in each location where the statement x%%d==0 was true. > > > > Any ideas on deconstructing this? > > > > --j > > > > -- > > Jonathan A. Greenberg, PhD > > Assistant Professor > > Global Environmental Analysis and Remote Sensing (GEARS) Laboratory > > Department of Geography and Geographic Information Science > > University of Illinois at Urbana-Champaign > > 607 South Mathews Avenue, MC 150 > > Urbana, IL 61801 > > Phone: 217-300-1924 > > http://www.geog.illinois.edu/~jgrn/ > > AIM: jgrn307, MSN: jgrn...@hotmail.com, Gchat: jgrn307, Skype: jgrn3007 > > > > ______________________________________________ > > 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. ______________________________________________ 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.