Why does print of S4 class call `show` without namespacing it?

故事扮演 提交于 2019-12-08 16:37:46

问题


I have a package shinyjs with a function called show. Today a user reported to me that this introduces problems when using S4 objects because "print"-ing an S4 object uses the show method, which is masked by my package when it's attached.

Example:

library(shinyjs)
setClass("testS4Object",
         representation(
           ID = "numeric",
           Name = "character"
         ),
         prototype(
           ID = NA_real_,
           Name = NA_character_
         )
)
x = new("testS4Object")
x

There's an error because when we print the value of x, it seems to call show under the scenes, but it's using shinyjs::show instead of methods::show. By printing methods::show(x) explicitly, the problem goes away. But I'm a bit confused as to why by default the S4 printing system calls show without namespacing it - isn't it dangerous and not really my package's fault that this bug is happening?

It is considered a very bad idea to have a function with the same name as a function in methods? My thinking is that the S4 system should know to call their own show function or an inherited S4 show function.

EDIT: I asked Hadley what he thinks and he seems to also think this might be a bug in R, I emailed r-devel to get their opinion


回答1:


The issue was reported to the R core team and was fixed on 2015-07-20 in SVN commit # 68702. Here is the fix

The fix will be available in R 3.3.0



来源:https://stackoverflow.com/questions/31127056/why-does-print-of-s4-class-call-show-without-namespacing-it

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!