From murdoch at stats.uwo.ca  Mon Sep 26 21:13:56 2005
From: murdoch at stats.uwo.ca (murdoch@stats.uwo.ca)
Date: Mon, 26 Sep 2005 21:13:56 +0200 (CEST)
Subject: [Rd] Assigning a zero length vector to a list (PR#8157)
Message-ID: <20050926191356.644711C8D2@slim.kubism.ku.dk>

On 9/26/2005 10:29 AM, Peter Dalgaard wrote:
> Duncan Murdoch <murdoch at stats.uwo.ca> writes:
> 
>> After foo<-list(), foo$bar is NULL, so we can simplify this.
>> 
>> Here's a simpler version:
>> 
>> # These work, which is a bit of a surprise, but there is some 
>> inconsistency:   one x becomes a list, the other is numeric:
>>  > x <- NULL
>>  > x[[1]] <- 1:10
>>  > x
>> [[1]]
>>   [1]  1  2  3  4  5  6  7  8  9 10
>> 
>>  > x <- NULL
>>  > x[[1]] <- 1
>>  > x
>> [1] 1
>> 
>> 
>> # This generates the same bug as the above:
>>  > x <- NULL
>>  > x[[1]] <- numeric(0)
>>  > x
>> [1] 4.250083e-314
>> 
>> It looks like we're trying to be too clever with handling assignments to 
>> components of NULL.  Wouldn't it make more sense for those to generate 
>> an error?
> 
> Once upon a time, we had pairlists, and NULL was the empty list. This
> looks like it might be a relic. If so, it likely also predates
> consistent handling of zero-length vectors, so something is getting
> confused. I think it would be reasonable to expect similar results to
> this: 
> 
>> x<-list()
>> x[[1]] <- numeric(0)
>> x
> [[1]]
> numeric(0)

I agree.  I think I see where the problem is (a test "length(y) <= 1" in 
do_subassign2_dflt in subassign.c should be "length(y) == 1"; I'll try 
to fix it.

Duncan Murdoch
> 
>  
> 
> S-PLUS also tries to handle NULL as a zero length list, with some
> anomalies:
> 
>> x <- NULL
>> x[[1]] <- numeric(0)
>> x
> $value:
> numeric(0)
> 
> 
>> x <- list()
>> x[[1]] <- numeric(0)
>> x
> [[1]]:
> numeric(0)
> 
>



[Rd] Assigning a zero length vector to a list (PR#8157)
murdoch@stats.uwo.ca