After I save an object that contains reference class objects in some of
its slots to a file and then re-load it, all.equal() seems to break for
me. Is this a bug in all.equal, or is it likely caused by bad
implementation of methods on my side? (I see that "'all.equal()'
gains
methods for 'environment's and 'refClass'es" for R 3.2.0,
but that was a
little while ago ...) I haven't ever noticed loading these objects from
files to be problematic before.
library(lme4)
fn <- "savecopy.rda"
unlink(fn)
fm1 <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy)
save("fm1",file="savecopy.rda")
rm(fm1)
load(fn)
'pp' is one of the slots in this S4 object; it contains a reference
class object. (The same thing happens for the other reference class
slot, 'resp', which is of a different RC ...)
all.equal(fm1 at pp,fm1 at pp$copy())
Error in as.character.factor(target) : attempting to coerce non-factor
Digging into this a bit I can see that all.equal() is attempting to
compare a 'current' and 'target' that both look like this:
str(current)
Formal class 'ordered' [package "methods"] with 1 slot
..@ .S3Class: chr [1:2] "ordered" "factor"
Browse[1]> current
Object of class "ordered"
ordered(0)
Levels:
... but I can't really make much more sense of it than that.
In contrast, this works fine:
fm2 <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy)
all.equal(fm2 at pp,fm2 at pp$copy()) ## TRUE
Any thoughts from someone wiser than I am about this stuff?