I haven't been following this conversation in order, but I think there's another bug here besides the one(s?) you identified:
Jens had this example: > x <- 1:4 > names(x) <- c(NA, "NA", "a", "") > x[names(x)] <NA> <NA> a <NA> 1 1 3 NA Shouldn't the second entry in the result be 2, with name "NA"? It seems the string "NA" has been converted to <NA> here. Duncan Murdoch Prof Brian Ripley wrote: > On Thu, 6 Oct 2005, "Jens Oehlschlägel" wrote: > > >>Dear Thomas, >> >> >>>This looks deliberate (there is a function NonNullStringMatch that does >>>the matching). I assume this is because there is no other way to >>>indicate that an element has no name. >> >>>If so, it is a documentation bug -- help(names) and FAQ 7.14 should >>>specify this behaviour. Too late for 2.2.0, unfortunately. >> >>I respectfully disagree: the element has a name, its an empty string. Of >>course "" is a doubtful name for an element, but as long as we allow this >>name when assigning names()<- we also should handle it like a name in >>subscripting. The alternative would be to disallow "" in names at all. >>However, both alternatives rather look like code changes, not only >>documentation. > > > I think Thomas is right as to how S interprets this: "" is no name on > assignment, wheread NA as a name is a different thing (there probably is a > name, we just do not know what it is). > > Here is the crux of the example. > > p <- c(a=1, 2) > >>p <- c(a=1, 2) >>names(p) > > [1] "a" "" > >>p > > a > 1 2 > >>p2 <- c(1,2) >>names(p2) <- c("a", "") >>identical(p, p2) > > [1] TRUE > > so giving the name is "" really is the same as giving no name. > > `Error 1' is said to be > > >>p[""] > > <NA> > NA > > You haven't given a name, so I think that is right. S (which has no > character NAs) uses "" as the name, but here there may be a name or not. > > >>P <- list(a=1, 2) > > > I think Jens then meant as `error 2' that > > >>P > > $a > [1] 1 > > [[2]] > [1] 2 > > shows no name for the second element, and that seems right to me (although > S shows "" here). > > Finally (`error 3') > > >>P[""] > > $"NA" > NULL > > is a length-one list with name character-NA. (S has no name here.) That > seems the right answer but if so is printed inconsistently. > > I would say that > > >>Q <- list(1, 2) >>names(Q) <- c("a", NA) >>Q > > $a > [1] 1 > > $"NA" > [1] 2 > > was the only bug here (the name should be printed as <NA>). Now that > comes from this bit of code > > if( isValidName(CHAR(PRINTNAME(TAG(s)))) ) > sprintf(ptag, "$%s", CHAR(PRINTNAME(TAG(s)))); > else > sprintf(ptag, "$\"%s\"", CHAR(PRINTNAME(TAG(s)))); > > so non-syntactic names are printed surrounded by "". Nowadays I think we > would prefer ``, as in > > >>A <- list("a+b"=1) >>A > > $"a+b" > [1] 1 > > >>A$"a+b" > > [1] 1 > >>A$`a+b` > > [1] 1 > > but NA needs to be a special case as in > > >>A <- list(1, 2) >>names(A) <- c("NA", NA) >>A > > $"NA" > [1] 1 > > $"NA" > [1] 2 > > >>is.na(names(A)) > > [1] FALSE TRUE > > > > > ------------------------------------------------------------------------ > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel