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
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel