为什么 S4 class 的打印在没有命名空间的情况下调用 `show`?

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

我有一个包 shinyjs,其中包含一个名为 show 的函数。今天一位用户向我报告说这会在使用 S4 对象时引入问题,因为 "print"-ing 一个 S4 对象使用 show 方法,它在附加时被我的包屏蔽。

示例:

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

有一个错误,因为当我们打印x的值时,它在幕后似乎调用了show,但它使用的是shinyjs::show而不是methods::show。通过显式打印 methods::show(x) ,问题就消失了。但是我有点困惑,为什么默认情况下 S4 打印系统调用 show 没有命名空间 - 这不是很危险,而且这个错误的发生并不是我的包的错误吗?

methods 中的函数同名的函数被认为是一个非常糟糕的主意?我的想法是,S4 系统应该知道调用自己的 show 函数或继承的 S4 show 函数。

编辑: 我问哈德利他怎么想,他似乎也认为这可能是 R 中的一个错误,我给 r-devel 发邮件征求他们的意见

此问题已报告给 R 核心团队,并已于 2015 年 7 月 20 日在 SVN 提交 # 68702 中修复。Here is the fix

修复将在 R 3.3.0 中可用