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

Dea*_*ali 8 r s4

我有一个包含shinyjs函数的包show.今天用户向我报告说,这在使用S4对象时会引入问题,因为"打印" - S4对象使用的show方法在附加时被我的包屏蔽.

例:

library(shinyjs)
setClass("testS4Object",
         representation(
           ID = "numeric",
           Name = "character"
         ),
         prototype(
           ID = NA_real_,
           Name = NA_character_
         )
)
x = new("testS4Object")
x
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:我问哈德利他的想法,他似乎也认为这可能是R中的一个错误,我通过电子邮件发送r-devel来获得他们的意见

Dea*_*ali 2

该问题已报告给 R 核心团队,并于 2015 年 7 月 20 日在 SVN 提交 # 68702 中得到修复。 修复如下

该修复将在 R 3.3.0 中提供