如何用roxygen2指定函数不绑定S3命名空间及相关疑问
关于R中plot.tukey函数与roxygen2的S3方法问题
我创建了plot.tukey函数,使用base绘图工具构建自定义图形,通过par(new=TRUE)叠加多个plot调用。使用roxygen2进行文档化时,它在NAMESPACE中自动添加了S3方法包装器:
# Generated by roxygen2: do not edit by hand S3method(plot,tukey) export(color.randomHEX)
疑问1:是否始终需要此类自动包装器?继承methods("plot")有哪些优缺点?
- 不是必须要这个自动包装器。只有当你希望
plot.tukey作为S3泛型plot()的方法,让用户可以通过plot(obj)(其中obj是tukey类对象)自动调用这个函数时,才需要它。如果你的plot.tukey只是一个普通的命名函数,不需要和S3泛型绑定,就可以不用。 - 继承
plot泛型的优点:- 符合R用户的使用习惯,用户无需记住特殊函数名,直接用熟悉的
plot()调用即可 - 利用S3方法的调度机制,自动根据输入对象的类匹配对应的绘图函数
- 便于和其他S3类的绘图方法保持一致的接口
- 符合R用户的使用习惯,用户无需记住特殊函数名,直接用熟悉的
- 继承
plot泛型的缺点:- 函数命名被限制为
plot.xxx的格式,灵活性降低 - 若后续
plot泛型的行为被修改,可能会影响到你的方法 - 若你的函数并非真正用于某类对象的绘图,强行绑定S3方法会造成用户误解
- 函数命名被限制为
疑问2:若不想让该函数绑定S3method,如何告知roxygen2?roxygen2为何默认将其关联到S3?仅依据函数名吗?如何让它像color.randomHEX那样原样导出,不关联S3?
- roxygen2默认把
plot.tukey识别为S3方法,完全是依据函数名的格式:它会自动识别泛型函数名.类名这种命名格式的函数,将其注册为对应泛型的S3方法。 - 要让它像
color.randomHEX那样作为普通函数导出,有两种可行方法:- 修改函数名,比如改成
plotTukey或者tukeyPlot,避开泛型.类名的命名格式,roxygen2就会把它当作普通函数处理。 - 若不想修改函数名,可以在roxygen2的文档注释里手动指定导出方式,添加
@export plot.tukey,而非默认的@export。这样roxygen2会在NAMESPACE中生成export(plot.tukey),而非S3method(plot,tukey)。
- 修改函数名,比如改成
内容的提问来源于stack exchange,提问作者mshaffer
相关产品推荐
相关产品推荐

