[R] are arithmetic comparison operators binary?

Martin Maechler maechler at stat.math.ethz.ch
Mon Feb 23 15:57:41 CET 2009


>>>>> "WK" == Wacek Kusnierczyk <Waclaw.Marcin.Kusnierczyk at idi.ntnu.no>
>>>>>     on Mon, 23 Feb 2009 12:06:32 +0100 writes:

Thank you, Wacek, 
though .. "wrong mailing list" 

    WK> the man page for relational operators (see, e.g., ?'<') says:
    WK> "
    WK> Binary operators which allow the comparison of values in atomic vectors.

    WK> Arguments:

    WK> x, y: atomic vectors, symbols, calls, or other objects for which
    WK> methods have been written.
    WK> "

    WK> it is somewhat surprizing that the following works:

    WK> '<'(1)
    WK> # logical(0)

    WK> '<'()
    WK> # logical(0)

    WK> '<'(1,2,3)
    WK> # TRUE

a bit surprising (sic!), indeed, even for me.
Thanks for your notice and report!

If you'd looked a bit in the sources, you'd seen that they
really are supposed to be binary only.

A very small change in the sources does accomplish this, passes
the standard checks (and I cannot imagine reasonable code that
would have relied on the more lenient behavior), so
this will have changed in one of the next versions of R-devel.

Martin Maechler, ETH Zurich


    WK> what does 'binary' mean here, precisely?  in the first two examples, one
    WK> might suspect that '<' treats the missing arguments as missing values,
    WK> but this would not be coherent with what the man page says:

    WK> "
    WK> Missing values ('NA') and 'NaN' values are regarded as
    WK> non-comparable even to themselves, so comparisons involving them
    WK> will always result in 'NA'.
    WK> "

    WK> i can't find the above explained in the documentation.  typing `<` shows
    WK> that it is a

    WK> function(e1, e2) .Primitive("<")

    WK> how come can/should it work with no complaint on input that does not
    WK> consist of exactly 2 arguments?
    WK> in scheme (which is claimed to have been an inspiration for r), < works
    WK> on an arbitrary number of arguments:

    WK> (<)
    WK> ;; #t
    WK> (< 1)
    WK> ;; #t
    WK> (< 1 2 3)
    WK> ;; #t
    WK> (< 1 2 0)
    WK> ;; #f

    WK> but there < is an arity-dispatched procedure, not a binary one, and it
    WK> produces sensible output for any number of arguments (arguably for n=0, 1).

    WK> vQ




More information about the R-help mailing list