From tlumley at u.washington.edu  Mon Mar 16 09:06:34 2009
From: tlumley at u.washington.edu (Thomas Lumley)
Date: Mon, 16 Mar 2009 01:06:34 -0700 (PDT)
Subject: [Rd] Definition of [[
In-Reply-To: <8b356f880903151131j53765d2fo5aaa8a84dc971817@mail.gmail.com>
Message-ID: <Pine.LNX.4.43.0903160106340.14839@hymn33.u.washington.edu>

On Sun, 15 Mar 2009, Stavros Macrakis wrote:

> The semantics of [ and [[ don't seem to be fully specified in the
> Reference manual.  In particular, I can't find where the following
> cases are covered:
>
>> cc <- c(1); ll <- list(1)
>
>> cc[3]
> [1] NA
> OK, RefMan says: If i is positive and exceeds length(x) then the
> corresponding selection is NA.
>
>> dput(ll[3])
> list(NULL)
> ? i is positive and exceeds length(x); why isn't this list(NA)?

I think some of these are because there are only NAs for character, logical, and the numeric types. There isn't an NA of list type.

This one shouldn't be list(NA) - which NA would it use?  It should be some sort of list(_NA_list_) type, and list(NULL) is playing that role.


>> ll[[3]]
> Error in list(1)[[3]] : subscript out of bounds
> ? Why does this return NA for an atomic vector, but give an error for
> a generic vector?

Again, because there isn't an NA of generic vector type.

>> cc[[3]] <- 34; dput(cc)
> c(1, NA, 34)
> OK
>
> ll[[3]] <- 34; dput(ll)
> list(1, NULL, 34)
> Why is second element NULL, not NA?
> And why is it OK to set an undefined ll[[3]], but not to get it?

Same reason for NULL vs NA.  The fact that setting works may just be an inconsistency -- as you can see from previous discussions, R often does not effectively forbid code that shouldn't work -- or it may be bug-compatibility with some version of S or S-PLUS.


      -thomas

Thomas Lumley			Assoc. Professor, Biostatistics
tlumley at u.washington.edu	University of Washington, Seattle



[Rd] Definition of [[
Thomas Lumley