[Rd] NROW and NCOL on NULL

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Sat Sep 23 23:38:29 CEST 2023


Às 20:41 de 23/09/2023, Simone Giannerini escreveu:
> I know it's documented and I know there are other ways to guard
> against this behaviour, once you know about this.
> The point is whether it might be worth it to make NCOL and NROW return
> the same value on NULL and make R more consistent/intuitive and
> possibly less error prone.
> 
> Regards,
> 
> Simone
> 
> On Sat, Sep 23, 2023 at 7:50 PM Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
>>
>> It's been documented for a long time that NCOL(NULL) is 1.  What
>> particular problems did you have in mind?  There might be other ways to
>> guard against them.
>>
>> Duncan Murdoch
>>
>> On 23/09/2023 1:43 p.m., Simone Giannerini wrote:
>>> Dear list,
>>>
>>> I do not know what would be the 'correct' answer to the following but
>>> I think that they should return the same value to avoid potential
>>> problems and hard to debug errors.
>>>
>>> Regards,
>>>
>>> Simone
>>> ---------------------------------------
>>>
>>>> NCOL(NULL)
>>> [1] 1
>>>
>>>> NROW(NULL)
>>> [1] 0
>>>
>>>> sessionInfo()
>>> R version 4.3.1 RC (2023-06-08 r84523 ucrt)
>>> Platform: x86_64-w64-mingw32/x64 (64-bit)
>>> Running under: Windows 11 x64 (build 22621)
>>>
>>> Matrix products: default
>>>
>>>
>>> locale:
>>> [1] LC_COLLATE=Italian_Italy.utf8  LC_CTYPE=Italian_Italy.utf8
>>> [3] LC_MONETARY=Italian_Italy.utf8 LC_NUMERIC=C
>>> [5] LC_TIME=Italian_Italy.utf8
>>>
>>> time zone: Europe/Rome
>>> tzcode source: internal
>>>
>>> attached base packages:
>>> [1] stats     graphics  grDevices utils     datasets  methods   base
>>>
>>> loaded via a namespace (and not attached):
>>> [1] compiler_4.3.1
>>>
>>
> 
> 
Hello,

The way I think of this behavior that made it intuitive is to think that 
in R matrices are column-major, therefore if length(NULL) == 0 then NULL 
can be seen as a matrix with one column and zero rows, no data.

Here are other examples for which that reasoning works:


m <- matrix(integer(0L))
NCOL(m)
NROW(m)

x <- integer(0L)
NCOL(x)
NROW(x)


Not very convincing? Maybe with time...

Hope this helps,

Rui Barradas



More information about the R-devel mailing list