为什么 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 中可用
我有一个包 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 中可用