From bbolker at gmail.com  Tue Aug  2 22:53:26 2016
From: bbolker at gmail.com (Ben Bolker)
Date: Tue, 2 Aug 2016 16:53:26 -0400
Subject: [Rd] save/load + all.equal on reference class objects
Message-ID: <6aea8f5c-cdf8-fcc8-6b74-9488b884a987@gmail.com>


 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?



[Rd] save/load + all.equal on reference class objects
Ben Bolker