[R] ifelse question (I'm not sure why this is working)...

William Dunlap wdunlap at tibco.com
Tue Sep 10 22:10:12 CEST 2013


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-bounces at r-project.org [mailto:r-help-bounces at 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-bounces at r-project.org [mailto:r-help-bounces at 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: jgrn307 at hotmail.com, Gchat: jgrn307, Skype: jgrn3007
> >
> > ______________________________________________
> > R-help at 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 at 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.



More information about the R-help mailing list