From maechler at lynne.stat.math.ethz.ch  Tue May 12 14:31:11 2015
From: maechler at lynne.stat.math.ethz.ch (Martin Maechler)
Date: Tue, 12 May 2015 14:31:11 +0200
Subject: [Rd] S4 method dispatch sometimes leads to incorrect when
 object loaded from file?
In-Reply-To: <5550E44F.1000807@fredhutch.org>
References: <554F76EB.3020804@fredhutch.org> <5550E44F.1000807@fredhutch.org>
Message-ID: <21841.62095.431262.917177@stat.math.ethz.ch>

>>>>> Martin Morgan <mtmorgan at fredhutch.org>
>>>>>     on Mon, 11 May 2015 10:18:07 -0700 writes:

    > On 05/10/2015 08:19 AM, Martin Morgan wrote:
    >> Loading an S4 object from a file without first loading the library sometimes (?,
    >> the example below and actual example involves a virtual base class and the show
    >> generic) leads to incorrect dispatch (to the base class method).

"Of course", this is not as desired.

Other code automatically does try and typically succeed to load the package
(yes "package" ! ;-)) when 'needed', right,  so  show() is an
exception here, no ?


    >> The attached package reproduces the problem. It has

    > The package was attached but stripped; a version is at

    > https://github.com/mtmorgan/PkgA

    > FWIW the sent mail was a multi-part MIME with the header on the package part

    > Content-Type: application/gzip;
    > name="PkgA.tar.gz"
    > Content-Transfer-Encoding: base64
    > Content-Disposition: attachment;
    > filename="PkgA.tar.gz"

    > From http://www.r-project.org/mail.html#instructions "we allow application/pdf, 
    > application/postscript, and image/png (and x-tar and gzip on R-devel)" so I 
    > thought that this mime type would not be stripped?

You were alright in your assumptions -- but unfortunately, the
accepted type has been  application/x-gzip instead of .../gzip.
I now *have* added the 2nd one as well.

Sorry for that.
The other Martin M..

    > Martin Morgan

    >> 
    >> setClass("A")
    >> setClass("B", contains="A")
    >> setMethod("show", "A", function(object) cat("A\n"))
    >> setMethod("show", "B", function(object) cat("B\n"))
    >> 
    >> with NAMESPACE
    >> 
    >> import(methods)
    >> exportClasses(A, B)
    >> exportMethods(show)
    >> 
    >> This creates the object and illustrated expected behavior
    >> 
    >> ~/tmp$ R --vanilla --slave -e "library(PkgA); b = new('B'); save(b,
    >> file='b.Rda'); b"
    >> B
    >> 
    >> Loading PkgA before the object leads to correct dispatch
    >> 
    >> ~/tmp$ R --vanilla --slave -e "library(PkgA); load(file='b.Rda'); b"
    >> B
    >> 
    >> but loading the object without first loading PkgA leads to dispatch to
    >> show,A-method.
    >> 
    >> ~/tmp$ R --vanilla --slave -e "load(file='b.Rda'); b"
    >> Loading required package: PkgA
    >> A
    >> 
    >> Martin Morgan


    > -- 
    > Computational Biology / Fred Hutchinson Cancer Research Center
    > 1100 Fairview Ave. N.
    > PO Box 19024 Seattle, WA 98109

    > Location: Arnold Building M1 B861
    > Phone: (206) 667-2793

    > ______________________________________________
    > R-devel at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] S4 method dispatch sometimes leads to incorrect when object loaded from file?
Martin Maechler