Duncan Murdoch
2015-Jun-30 12:20 UTC
[Rd] Defining a `show` function breaks the print-ing of S4 object -- bug or expected?
On 30/06/2015 1:57 PM, Hadley Wickham wrote:> A slightly simpler formulation of the problem is: > > show <- function(...) stop("My show!") > methods::setClass("Person", slots = list(name = "character")) > methods::new("Person", name = "Tom") > #> Error in (function (...) : My show!Just to be clear: the complaint is that the auto-called show() is not methods::show? I.e. after x <- methods::new("Person", name = "Tom") you would expect show(x) to give the error, but not x ?? Duncan Murdoch> > Hadley > > On Tue, Jun 30, 2015 at 9:02 AM, Dean Attali <daattali at gmail.com> wrote: >> Hi r-devel >> >> If you define a function named `show` or attach a package with an exported >> `show` function, then printing/vieweing S4 objects breaks. This is probably >> because the `print` function calls `show`, which is now masked. >> >> Example: >> >> show <- function() {} >>> setClass("Person", slots = list(name = "character")) >>> tom <- new("Person", name = "Tom") >>> tom # error >>> methods::show(tom) # works >> >> >> The error was a surprise to me because I was under the assumption that >> `show` would be namespaced and therefore should not break. >> I'm wondering if this is intended behaviour, or if this is a problem. My >> intuition, and Hadley agreed on Twitter, is that defining a `show` method >> should not have such a grave effect on printing S4 objects. >> >> Thanks >> >> --- >> http://deanattali.com >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-devel at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel > > >
Hadley Wickham
2015-Jun-30 12:38 UTC
[Rd] Defining a `show` function breaks the print-ing of S4 object -- bug or expected?
On Tue, Jun 30, 2015 at 2:20 PM, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:> On 30/06/2015 1:57 PM, Hadley Wickham wrote: >> A slightly simpler formulation of the problem is: >> >> show <- function(...) stop("My show!") >> methods::setClass("Person", slots = list(name = "character")) >> methods::new("Person", name = "Tom") >> #> Error in (function (...) : My show! > > Just to be clear: the complaint is that the auto-called show() is not > methods::show? I.e. after > > x <- methods::new("Person", name = "Tom") > > you would expect > > show(x) > > to give the error, but not > > x > > ??Correct - I'd expect print() to always call methods::show(), not whatever show() is first on the search path. Hadley -- http://had.co.nz/
luke-tierney at uiowa.edu
2015-Jun-30 15:11 UTC
[Rd] Defining a `show` function breaks the print-ing of S4 object -- bug or expected?
Same thing happens with S3 if you redefine print(). I thought that code was actually calculating the function to call rather than the symbol to use, but apparently not. Shouldn't be too hard to fix. luke On Tue, 30 Jun 2015, Hadley Wickham wrote:> On Tue, Jun 30, 2015 at 2:20 PM, Duncan Murdoch > <murdoch.duncan at gmail.com> wrote: >> On 30/06/2015 1:57 PM, Hadley Wickham wrote: >>> A slightly simpler formulation of the problem is: >>> >>> show <- function(...) stop("My show!") >>> methods::setClass("Person", slots = list(name = "character")) >>> methods::new("Person", name = "Tom") >>> #> Error in (function (...) : My show! >> >> Just to be clear: the complaint is that the auto-called show() is not >> methods::show? I.e. after >> >> x <- methods::new("Person", name = "Tom") >> >> you would expect >> >> show(x) >> >> to give the error, but not >> >> x >> >> ?? > > Correct - I'd expect print() to always call methods::show(), not > whatever show() is first on the search path. > > Hadley > >-- 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