两种创建S4对象的方式有何差异?性能与NAMESPACE要求解析
S4对象创建两种写法的性能与NAMESPACE要求差异
我在多个R包中见过以下两种创建S4对象的写法:
foo <- setClass('foo',[slots defined]) bar <- foo([data ])
setClass('foo',[slots defined]) bar <- new('foo',[data])
请问这两种方式在性能上是否存在差异?在NAMESPACE文件的要求上是否有区别?
性能差异
两种写法在性能上几乎没有差异。因为setClass()返回的构造函数(即示例中的foo)本质是对new()的封装,内部最终还是会调用new()完成对象实例化。你可以直接在R控制台输入foo(执行setClass后)查看源码,能看到它的核心逻辑就是调用new(.Class, ...)。
NAMESPACE配置差异
二者在NAMESPACE文件的要求上存在明显区别:
- 第一种写法(使用
setClass返回的构造函数):若要对外暴露构造函数foo,需在NAMESPACE中添加export(foo);仅包内部使用时,无需额外导出,但要保证setClass在包加载过程中执行(比如放在R/目录的脚本里)。 - 第二种写法(直接调用
new()):包内部使用new('foo')无需额外配置,只要类foo已通过setClass注册即可;若允许外部用户使用new('foo'),则必须在NAMESPACE中添加exportClasses(foo)导出该类,否则外部无法识别foo类名。
额外说明:第一种写法更贴合面向对象的封装理念,用户无需记忆类名字符串,直接调用函数即可;第二种写法更灵活,适合需要动态指定类名的场景。
内容的提问来源于stack exchange,提问作者Carl Witthoft
相关产品推荐
相关产品推荐

