[Rd] Definition of [[
Duncan Murdoch
murdoch at stats.uwo.ca
Sun Mar 15 21:43:29 CET 2009
On 15/03/2009 2:31 PM, 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)?
Because the sentence you read was talking about "simple vectors", and ll
is presumably not a simple vector. So what is a simple vector? That is
not explicitly defined, and it probably should be. I think it is
"atomic vectors, except those with a class that has a method for [".
>
>> 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?
>
>> 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?
NA is a length 1 atomic vector with a specific type matching the type of
c. It makes more sense in this context to put in a NULL, and return a
list(NULL) for ll[3].
> And why is it OK to set an undefined ll[[3]], but not to get it?
Lots of code grows vectors by setting elements beyond the end of them,
so whether or not that's a good idea, it's not likely to change.
I think an argument could be made that ll[[toobig]] should return NULL
rather than trigger an error, but on the other hand, the current
behaviour allows the programmer to choose: if you are assuming that a
particular element exists, use ll[[element]], and R will tell you when
your assumption is wrong. If you aren't sure, use ll[element] and
you'll get NA or list(NULL) if the element isn't there.
> I assume that these are features, not bugs, but I can't find
> documentation for them.
There is more documentation in the man page for Extract, but I think it
is incomplete. The most complete documentation is of course the source
code, but it may not answer the question of what's intentional and
what's accidental.
Duncan Murdoch
More information about the R-devel
mailing list