On May 1, 2012, at 1:33 PM, Bert Gunter wrote:

AdvisoRs:

Is the following a bug, feature, hinky error message, or dumb Bert?

mtest <- matrix(1:12,nr=4)
dftest <- data.frame(mtest)
ix <- cbind(1:2,2:3)
mtest[ix] <- NA
mtest
   [,1] [,2] [,3]
[1,]    1   NA    9
[2,]    2    6   NA
[3,]    3    7   11
[4,]    4    8   12

## But ...
dftest[ix] <- NA
Error in `[<-.data.frame`(`*tmp*`, ix, value = NA) :
only logical matrix subscripts are allowed in replacement

I'm not sure _I_ would have expected '[<-.data.frame' to recognize that a matrix was being offered because the "[.]" formalism without a comma (called "i-indexing" on the help page) would generally be referencing only columns (i.e. list elements). I had not realized the possibilitiy of offering a logical matrix to df but it does succeed as predicted by

?"[.data.frame"

" For replacement, a logical matrix (only) can be used to select the elements to be replaced in the same way as for a matrix."

So how you want to characterize documented behavior is your call. I would never choose the label you offered.


> mtest <- matrix(FALSE, 4,4)
> ix <- cbind(1:2,2:3)
> dftest <- data.frame(mtest)
> mtest[ix] <- TRUE
> dftest[mtest] <- "a"
> dftest
    X1    X2    X3    X4
1 FALSE     a FALSE FALSE
2 FALSE FALSE     a FALSE
3 FALSE FALSE FALSE FALSE
4 FALSE FALSE FALSE FALSE

The nonassignment operation still succeeds:

> dftest[ix]
[1] "a" "a"


Obviously, I was expecting matrix indexing for replacement to work
similarly in both cases; however, I can see why it would be
problematic for data frames (mixed types), but was a bit nonplussed by
the error message, which seems hinky to me.

Cheers,
Bert

--
--

David Winsemius, MD
Heritage Laboratories
West Hartford, CT

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to