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.