[Rd] apply with zero-row matrix

David Hugh-Jones d@vidhughjone@ @ending from gm@il@com
Mon Jul 30 11:12:24 CEST 2018

```Hi Martin,

Fair enough for R functions in general. But the behaviour of apply violates
the expectation that apply(m, 1, fun) calls fun n times when m has n rows.
That seems pretty basic.

Also, I understand from your argument why it makes sense to call apply and
return a special result (presumably NULL) for an empty argument; but why
should apply call fun?

Cheers
David

On Mon, 30 Jul 2018 at 08:41, Martin Maechler <maechler using stat.math.ethz.ch>
wrote:

> >>>>> David Hugh-Jones
> >>>>>     on Mon, 30 Jul 2018 05:33:19 +0100 writes:
>
>     > Forgive me if this has been asked many times before, but I
>     > couldn't find anything on the mailing lists.
>
>     > I'd expect apply(m, 1, foo) not to call `foo` if m is a
>     > matrix with zero rows.  In fact:
>
>     > m <- matrix(NA, 0, 5)
>     > apply(m, 1, function (x) {cat("Called...\n"); print(x)})
>     > ## Called...
>     > ## [1] FALSE FALSE FALSE FALSE FALSE
>
>
>     > Similarly for apply(m, 2,...) if m has no columns.  Is
>     > there a reason for this?
>
> Yes :
>
> The reverse is really true for almost all basic R functions:
>
>     They *are* called and give an "empty" result automatically
>     when the main argument is empty.
>
> What you basicaly propose is to add an extra
>
>      if(<length 0 input>)
>          return(<correspondingly formatted length-0 output>)
>
> to all R functions.  While that makes sense for high-level R
> functions that do a lot of things, this would really be a bad
> idea in general :
>
> This would make all of these basic functions larger {more to maintain} and
> slightly slower for all non-zero cases just to make them
> slightly faster for the rare zero-length case.
>
> Martin Maechler
> ETH Zurich and R core Team
>
> --
Sent from Gmail Mobile

[[alternative HTML version deleted]]

```