Dear R-devel readers, ( = people interested in the improvement and development of R).
This is not the first time that this topic is raised. and I am in now state to promise that anything will result from this thread ... Still, I think the majority among us has agreed that 1) you should never use ifelse(test, yes, no) if you know that length(test) == 1, in which case if(test) yes else no is much preferable (though not equivalent: ifelse(NA, 1, 0) !) 2) it is potentially inefficient by design since it (almost always) evaluates both 'yes' and 'no' independent of 'test'. 3) is a nice syntax in principle, and so is often used, also by myself, inspite of '2)' just because nicely self-explaining code is sometimes clearly preferable to more efficient but less readable code. 4) it is too late to change ifelse() fundamentally, because it works according to its documentation (and I think very much the same as in S and S-PLUS) and has done so for ages. ---- and if you don't agree with 1) -- 4) you may pretend for a moment instead of starting to discuss them thoroughly. Recently, a useR has alerted me to the fact that my Rmpfr's package arbitrary (high) precision numbers don't work for a relatively simple function. As I found the reason was that that simple function used ifelse(.,.,.) and the problem was that the (*simplified*) gist of ifelse(test, yes, no) is test <- as.logical(test) ans <- test ans[ test] <- yes ans[!test] <- no and in case of Rmpfr, the problem is that <logical>[<logical>] <- <mpfr> cannot work correctly [[ maybe it could in a future R, if I could define a method setReplaceMethod("[", c("logical,"logical","mpfr"), function(x,i,value) .........) but that currently fails as the C-low-level dispatch for '[<-' does not look at the full signature ]] I vaguely remember having seen proposals for light weight substitutes for ifelse(), called ifelse1() or ifelse2() etc... and I wonder if we should not try to see if there was a version that could go into "base R" (maybe the 'utils' package, not 'base'; that's not so important). One difference to ifelse() would be that the type/mode/class of the result is not initialized by logical, by default but rather by the "common type" of yes and no ... maybe determined by c()'ing parts of those. The idea was that this would work for most S3 and S4 objects for which logical 'length', (logical) indexing '[', and 'rep()' works. One possibility would also be to consider a "numbers-only" or rather "same type"-only {e.g., would also work for characters} version. Of course, an ifelse2() should also be more efficient than ifelse() in typical "atomic" cases. Thank you for your ideas and suggestions. Again, there's no promise of implementation coming along with this e-mail. Martin Maechler ETH Zurich ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel