[Rd] Use of all/any

Martin Maechler maechler at stat.math.ethz.ch
Fri Oct 26 18:18:08 CEST 2007

>>>>> "BDR" == Prof Brian Ripley <ripley at stats.ox.ac.uk>
>>>>>     on Fri, 26 Oct 2007 08:16:03 +0100 (BST) writes:

    BDR> all/any coerce their arguments to logical (if
    BDR> possible).  I've added a warning in R-devel if coercion
    BDR> is from something other than integer.

    BDR> This arose because it is easy to make a slip and write
    BDR> all(X) > 0 rather than all(X > 0): thanks to Bill
    BDR> Dunlap for bringing that to my attention.  

    BDR> However, it has been useful in detecting quite a few other things:

    BDR> - indices which had been made double where integer was
    BDR> intended. One example from predict.lm was

    BDR>                  iipiv[ii == 0] <- 0

    BDR> which was intended to be

    BDR>                  iipiv[ii == 0L] <- 0L

Hmm....  Do we really want to generate warnings for such small
I'm very happy that we've introduced   <n>L integer notation, and
as a subtle programmer, I'm making use of it gladly --- but
still not always, just for code beauty reasons ("0" reads better).

On the other hand, I don't think the casual R / S programmer
should get warnings; after all, S and R  are not C on purpose.

Apropos Bill Dunlap's note:  Do newer versions of S-plus warn?
At least up to 6.2.2, I'm pretty sure no S version has warned
	X <- c(0.1, pi)
	all(X) > 0.5

In spite, of the buglets of you have revealed, mentioned below,
currently, I'd still tend to only warn for coercion from
non-numeric, but not from double.

In this context, I have thought again of using *levels* of
warnings, configurable via options(), and we could activate more
stringent warnings when "R CMD check"ing than per default.

Actually, we already have a simple form of that (with I think message()),
and also with the way the 'codetools' ``warnings'' are treated
by 'R CMD check'.
For my taste and "S language feeling", such a	
    'double -> logical coercion warning'
is somewhat similar in sprit to some of the codetools warnings.


    BDR> - uses of lapply where sapply was intended.  Examples
    BDR> are of the form

    BDR>  	all(lapply(z, is.numeric))

    BDR> which is applying all() to a list.  One might worry
    BDR> that

    BDR>  	sapply(z, is.numeric)

    BDR> will return a list if length(z) == 0 (which it does)
    BDR> and so all() would warn, but that is covered by another
    BDR> change, to ignore all length-zero arguments (and so
    BDR> avoid the cost of coercion to logical(0)).

    BDR> I decided not to warn on integer as it is so common.
    BDR> But at least some of these are thinkos.  For example,
    BDR> constructions like

    BDR>  	all(grep(pattern, x))

    BDR> occurred scores of times in the R sources.  Since the
    BDR> value of grep() is an integer vector of positive
    BDR> indices, this is equivalent to

    BDR>  	length(grep(pattern, x)) > 0

    BDR> and when used in a if() condition the '> 0' is not
    BDR> needed.

    BDR> Some warnings are common from other packages: one is

    BDR> Warning in any(textLocations) : coercing argument of
    BDR> type 'double' to logical

    BDR> from lattice (and Deepayan Sarkar will fix that
    BDR> shortly).  Quite a few others looked familiar but are
    BDR> the result of package authors copying code from base R
    BDR> or other packages: if you do that you do need to copy
    BDR> the bugfixes too.

More information about the R-devel mailing list