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

时间:2015-06-29 23:09:47

标签: 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

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

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

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

1 个答案:

答案 0 :(得分:1)

该问题已向R核心小组报告,并于2015年7月20日在SVN提交#68702中得到​​修复。Here is the fix

此修复程序将在R 3.3.0中提供