为什么S4类的print调用'show',而不使用名称空间?

为什么S4类的print调用'show',而不使用名称空间?,r,s4,R,S4,我有一个名为show的包shinyjs。今天,一位用户向我报告说,这在使用S4对象时会带来问题,因为“打印”S4对象使用了show方法,该方法在附加时被我的包屏蔽 例如: library(shinyjs) setClass("testS4Object", representation( ID = "numeric", Name = "character" ), prototype(

我有一个名为
show
的包
shinyjs
。今天,一位用户向我报告说,这在使用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
,而不使用名称空间来命名它-发生这个错误不是很危险,也不是我的软件包的错吗

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


编辑:我问哈德利他的想法,他似乎也认为这可能是R中的一个漏洞,我给R-devel发电子邮件征求他们的意见

该问题已报告给R核心团队,并于2015-07-20在SVN提交68702中修复


修复程序将在R 3.3.0中提供

是否打算由客户使用?如果不是,则导出它(例如在
名称空间
文件中)是否会影响包中其他函数的功能。它是软件包中最流行的函数。在那时候它可能最容易重命名。所以我是否理解定义
show
方法与定义
print
方法一样危险?这是打印S4的预期行为?我相信这是正确的。我不完全确定这一点,但我认为问题主要源于
方法
是自动加载的,因此您导出的
show
函数首先在R的搜索路径上找到。但我在这里只是半推测,所以最好不要做任何改变,直到有人能给你一个更好的答案。好问题。