[Rd] No [[<-.factor()
Martin Maechler
maechler at stat.math.ethz.ch
Mon Aug 30 11:48:57 CEST 2010
>>>>> Prof Brian Ripley <ripley at stats.ox.ac.uk>
>>>>> on Mon, 30 Aug 2010 08:28:24 +0100 (BST) writes:
> On Thu, 26 Aug 2010, Martin Maechler wrote:
>>>>>>> "WD" == William Dunlap <wdunlap at tibco.com>
>>>>>>> on Wed, 25 Aug 2010 17:31:27 -0700 writes:
>>
WD> Should there be a [[<-.factor() that either throws
WD> an error or acts like [<-.factor() to avoid making
WD> an illegal object of class factor?
>>
>> Yes, one or the other.
>> Note that both `[<-` and `[[<-` are "Primitive" and do some
>> "informal dispatch" in addition to the formal method dispatch,
> I don't think so. do_subassign2 does formal method dispatch, albeit
> internally, but nothing else (do_assign2_dflt selects only by
> typeof()).
One consider that as an "informal dispatch", notably
distinguishing "list"s and atomics...
>> so there's no need for an explicit '[[<-.factor' method definition.
>> For factors, it seems rational and "expectable" that
>> double bracket behaves as single bracket when *one* element is
>> assigned.
>> z[[2:3]] <- c("Two, Three")
>> however should continue to give an error.
> I added a [[<-.factor yesterday. Note that we do have a [<-.factor
> which works on the integer codes, and I simply copied its logic.
thank you!
> BTW, you probably meant
> z[[2:3]] <- c("Two", "Three")
yes, indeed!
Martin
>> >> z <- factor(c("Two","Two","Three"), levels=c("One","Two","Three"))
>> >> z
WD> [1] Two Two Three
WD> Levels: One Two Three
>> >> str(z)
WD> Factor w/ 3 levels "One","Two","Three": 2 2 3
>> >> z[[2]] <- "One"
>> >> str(z) # the .Data part is now character
WD> Factor w/ 3 levels "One","Two","Three": 2 One 3
>> >> z
WD> [1] <NA> <NA> <NA>
WD> Levels: One Two Three
>> >> z[2] <- "One"
WD> Error in class(x) <- cx : adding class "factor" to an invalid object
>>
WD> Bill Dunlap
WD> Spotfire, TIBCO Software
WD> wdunlap tibco.com
More information about the R-devel
mailing list