[R] NULL elements in lists ... a nightmare
(Ted Harding)
Ted.Harding at manchester.ac.uk
Sun Oct 25 09:30:51 CET 2009
On 25-Oct-09 09:52:42, Patrick Burns wrote:
> 'The R Inferno' page 59.
>
> Patrick Burns
> patrick at burns-stat.com
> +44 (0)20 8525 0696
> http://www.burns-stat.com
> (home of "The R Inferno" and "A Guide for the Unwilling S User")
Which essentially says that
If you want the component [x1[comp] of the list x1] to stay there
but to be NULL, then do:
xl[comp] <- list(NULL)
I agree that this can be very puzzling! The essential point is that
(moving to Maura's example)
myList[2] or, equivalently, myList["second"]
is a LIST (whose only component is that component of the original
myList). On the other hand,
myList[[2]] or, equivalently, myList$second
is NOT a list, but is the value of that component of myList:
myList[1]
# $first
# [1] "aaa"
myList[[1]]
# [1] "aaa"
myList["first"]
# $first
# [1] "aaa"
myList[["first"]]
# [1] "aaa"
Note the statement (under "Recursive (list-like) objects")
in ?"$" or, equivalently, ?Extract
When either '[[' or '$' is used for replacement, a value
of 'NULL' deletes the corresponding item of the list.
Therefore changing the value of a comnponent of a list to NULL
deletes it. So you have to work at the list level, replacing
one list by another list. Hence Patrick's tip.
Ted.
> mauede at alice.it wrote:
>> I can define a list containing NULL elements:
>>
>>> myList <- list("aaa",NULL,TRUE)
>>> names(myList) <- c("first","second","third")
>>> myList
>> $first
>> [1] "aaa"
>> $second
>> NULL
>> $third
>> [1] TRUE
>>> length(myList)
>> [1] 3
>>
>> However, if I assign NULL to any of the list element then such
>> element is deleted from the list:
>>
>>> myList$second <- NULL
>>> myList
>> $first
>> [1] "aaa"
>> $third
>> [1] TRUE
>>> length(myList)
>> [1] 2
>>> #
>>> myList$first <- NULL
>>> myList
>> $third
>> [1] TRUE
>>> length(myList)
>> [1] 1
>>
>> Instead vectors cannot include NULL element:
>>
>>> vec <- c(TRUE,NULL,FALSE)
>>> vec
>> [1] TRUE FALSE
>>> length(vec)
>> [1] 2
>>> vec[1] <- NULL
>> Error in vec[1] <- NULL : replacement has length zero
>>
>> Is the above shown behaviour of list data structures to be expected ?
>> I took me a lot of sweat to figure out this wierd behaviour was the
>> cause of a bug
>> in my big program.
>> In general, if I have a list with some elements initialized to NULL,
>> that can be changed
>> dynamically, then how can I reinitialize such elements to NULL without
>> deleting them
>> from the list ?
>>
>> Thank you in advance,
>> Maura
>>
>>
>>
>>
>>
>> [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 25-Oct-09 Time: 09:30:45
------------------------------ XFMail ------------------------------
More information about the R-help
mailing list