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

Reply via email to