为什么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
函数或继承的S4show
函数
编辑:我问哈德利他的想法,他似乎也认为这可能是R中的一个漏洞,我给R-devel发电子邮件征求他们的意见该问题已报告给R核心团队,并于2015-07-20在SVN提交68702中修复
修复程序将在R 3.3.0中提供是否打算由客户使用?如果不是,则导出它(例如在名称空间
文件中)是否会影响包中其他函数的功能。它是软件包中最流行的函数。在那时候它可能最容易重命名。所以我是否理解定义show
方法与定义print
方法一样危险?这是打印S4的预期行为?我相信这是正确的。我不完全确定这一点,但我认为问题主要源于方法
是自动加载的,因此您导出的show
函数首先在R的搜索路径上找到。但我在这里只是半推测,所以最好不要做任何改变,直到有人能给你一个更好的答案。好问题。