[Rd] Recycling in arithmetic operations involving zero-length vectors

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Mon Jan 16 14:58:25 CET 2023


On 16/01/2023 6:55 a.m., David Winsemius wrote:
> 
> 
> Sent from my iPhone
> 
>> On Jan 16, 2023, at 6:11 PM, Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
>>
>> On 16/01/2023 5:23 a.m., Roland Fuß wrote:
>>> Dear R-core,
>>> The language definition is very clear:
>>> "As from R 1.4.0, any arithmetic operation involving a zero-length
>>> vector has a zero-length result."
>>> Thus, `1 + numeric()` returns `numeric(0)`. However, I don't find this
>>> very intuitive because usually the shorter vector is recycled to the
>>> length of the longer vector. Would it be possible to throw at least a
>>> warning for such cases? I don't expect them to be intended by most users.
>>> Best regards,
>>
>> The previous paragraph says "If the length of the longer vector is not a multiple of the shorter one, a warning is given."  Since 1 is not a multiple of 0, that implies a warning should be given here.
>>
>> However, R 1.4.0 was released more than 20 years ago, so I would guess there are lots of packages intentionally using this.  For example, it's a way to propagate bad inputs through a long calculation that allows a single test at the end.
>>
>> And even unintentional uses are unlikely to lead to problematic results:  numeric(0) is usually a pretty clear signal that something is wrong.
>>
>> So I'd suggest a documentation change: "As from R 1.4.0, any arithmetic operation involving a zero-length vector has a zero-length result *without a warning*."
> 
> I doubt that a documentation change will help very much. Roland is responding here with his and my surprise at the lack of a warning after witnessing my answer to an R newb Q where the impression at seeing ’numeric(0) was understood as the value 0. I suggested that many interpretations were possible and that a warning was given for NA generation. I stand with Roland in thinking a warning is appropriate.

I didn't see this exchange, but I don't understand "a warning was given 
for NA generation".  We don't get a warning for 1 + NA.  Do you mean 
you'd like to get one?

In any case, I think your anecdote illustrates a different problem: 
printing numeric() as numeric(0) confused a beginning user.  I've also 
seen people get confused by that.

Perhaps the change should be to the way numeric(0) is printed, but  that 
would also have consequences, since some people test the way output is 
printed.

Or perhaps we should just recognize that it's in the nature of being a 
beginning user to be confused sometimes, and just help them to grow out 
of that stage.

Before a change like one of these is made, someone should make it in a 
local copy, then run R CMD check on every package on CRAN to see how 
disruptive it is.  Maybe adding a warning() will uncover so few 
intentional uses that fixing them is worthwhile.

The trouble is, running checks across CRAN is a very resource-intensive 
exercise, and analyzing the results is a very developer-intensive 
exercise.  I'm sure the doc change is easier.

Duncan Murdoch



More information about the R-devel mailing list