[Rd] seq.int/seq.default

Martin Maechler
Wed, 04 Jan 2017 09:26:45 -0000

>>>>> Mick Jordan <mick.jordan at oracle.com>
>>>>>     on Tue, 3 Jan 2017 07:57:15 -0800 writes:

    > This is a message for someone familiar with the implementation.
    > Superficially the R code for seq.default and the C code for seq.int
    > appear to be semantically very similar. My question is whether, in
fact,
    > it is intended that behave identically for all inputs.

Strictly speaking, "no":  As usual, RT?Manual (;-)

The help page says in the very first paragraph ('Description'):

  ?seq? is a standard generic with a default method.
  ?seq.int? is a primitive which can be much faster but has a few restrictions.

    > I have found two cases so far where they differ, first
    > that seq.int will coerce a character string to a real (via
    > Rf_asReal) whereas seq.default appears to coerce it to NA
    > and then throws an error:

    >> seq.default("2", "5")
    > Error in seq.default("2", "5") : 'from'
cannot be NA, NaN or infinite
    >> seq.int("2", "5")
    > [1] 2 3 4 5
    >>

this may be a bit surprising (if one does _not_ look at the code),
indeed, notably because seq.int() is mentioned to have more
restrictions than seq() which here calls seq.default().
"Surprising" also when considering

   > "2":"5"
   [1] 2 3 4 5

and the documentation of ':' claims 'from:to' to be the same as
rep(from,to)  apart from the case of factors.

--- I am considering a small change in  seq.default()
which would make it work for this case, compatibly with ":" and
seq.int().


    > and second, that the error messages for non-numeric arguments differ:

which I find fine... if the functions where meant to be
identical, we (the R developers) would be silly to have both,
notably as the ".int" suffix  has emerged as confusing the
majority of useRs (who don't read help pages).

Rather it has been meant as saying "internal" (including
"fast") also for other
such R functions, but the suffix of course is a potential clash
with S3 method naming schemes _and_ the fact that 'int' is used
as type name for integer in other languages, notably C.

    > seq.default(to=quote(b), by=2)
    > Error in is.finite(to) : default method not implemented for type
'symbol'

which I find a very appropriate and helpful message

    > seq.int(to=quote(b), by=2)
    > Error in seq.int(to = quote(b), by = 2) :
    > 'to' cannot be NA, NaN or infinite

which is true, as well, and there's no "default method" to be
mentioned, but you are right that it would be nicer if the
message mentioned 'symbol' as well.

    > Please reply off list.

[which I understand as that we should  CC you (which of course is
 netiquette to do)]

Martin Maechler
ETH Zurich