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-tier...@uiowa.edu
Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel