Search code examples
rr-s4

Why does print of S4 class call `show` without namespacing it?


I have a package shinyjs with a function called show. Today a user reported to me that this introduces problems when using S4 objects because "print"-ing an S4 object uses the show method, which is masked by my package when it's attached.

Example:

library(shinyjs)
setClass("testS4Object",
         representation(
           ID = "numeric",
           Name = "character"
         ),
         prototype(
           ID = NA_real_,
           Name = NA_character_
         )
)
x = new("testS4Object")
x

There's an error because when we print the value of x, it seems to call show under the scenes, but it's using shinyjs::show instead of methods::show. By printing methods::show(x) explicitly, the problem goes away. But I'm a bit confused as to why by default the S4 printing system calls show without namespacing it - isn't it dangerous and not really my package's fault that this bug is happening?

It is considered a very bad idea to have a function with the same name as a function in methods? My thinking is that the S4 system should know to call their own show function or an inherited S4 show function.

EDIT: I asked Hadley what he thinks and he seems to also think this might be a bug in R, I emailed r-devel to get their opinion


Solution

  • The issue was reported to the R core team and was fixed on 2015-07-20 in SVN commit # 68702. Here is the fix

    The fix will be available in R 3.3.0