[External] Re: Change to I() in R 4.1
On Fri, 30 Oct 2020, Pages, Herve wrote:
On 10/29/20 23:08, Pages, Herve wrote: ...
I can think of 2 ways to move forward: 1. Keep I()'s current implementation but suppress the warning. We'll make the necessary adjustments to DataFrame() to repair columns supplied as I(<S4>) objects. Note that we would still be in the situation where I(<S4>) objects break validObject() but we've been in that situation for years and so far we've managed to work around it. However this doesn't mean that validObject() shouldn't be fixed. Note that print(I(<S4>)) would also need to be fixed (it says "<S4 Type Object>" which is misleading). Anyways, these 2 issues are separated from the main issue and can be dealt with later.
1b. A variant of the above could be to use the old implementation for S4
objects only:
I <- function(x)
{
if (isS4(x)) {
structure(x, class = unique.default(c("AsIs", oldClass(x))))
} else {
`class<-`(x, unique.default(c("AsIs", oldClass(x))))
}
}
That is probably a good compromise for now.
Not really. The underlying problem is that class<- and attributes<- (which is what structure() uses) handle the 'class' attribute differently, and that needs to be fixed. I don't have a strong opinion on what either should do, but they should do the same thing. It's probably worth re-thinking the I() mechanism. ?Modifying the value, whether by changing the class or an attribute, is going to be brittle. A little less so for an attribute, but using an attribute rules out dispatch on the AsIs property. Best, luke
I would also suggest that the "package" attribute of the S4 class be
kept around so the code that we use to restore the original object has a
way to restore it exactly, including its full class specification. Right
now, and also with the previous implementation, we cannot do that
because attr(class(x), "package") is lost. So something like this:
I <- function(x)
{
if (isS4(x)) {
x_class <- class(x)
new_classes <- c("AsIs", x_class)
attr(new_classes, "package") <- attr(x_class, "package")
structure(x, class=new_classes)
} else {
`class<-`(x, unique.default(c("AsIs", oldClass(x))))
}
}
Thanks,
H.
Luke Tierney
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa Phone: 319-335-3386
Department of Statistics and Fax: 319-335-3017
Actuarial Science
241 Schaeffer Hall email: luke-tierney at uiowa.edu
Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu