已知R对象类时可直接调用对应方法吗?未导出S3方法如何跳过类查找提速
可行解决方案
共有两种合规且无需修改BarPackage导出规则的方案,均可跳过S3类查找步骤,达到你需要的性能优化效果:
方案1:预获取S3方法(推荐)
在包加载阶段一次性获取对应S3方法并绑定到本地变量,仅执行一次方法查找,后续所有调用直接使用已获取的函数,稳定性更高,也符合R包开发规范:
# 放到包R文件的顶层作用域,包加载时仅执行一次 Bar_num <- getS3method("Bar", "numeric", envir = asNamespace("BarPackage")) #' @importFrom BarPackage Bar Foo <- function (n, x) { replicate(1e6, Bar_num(numeric(n), x)) }
这种方式不需要修改BarPackage的任何配置,也不会依赖未导出函数的显式名称,即使后续BarPackage对方法名做了内部调整,只要S3注册关系不变,代码就可以正常运行。
方案2:直接访问包内未导出方法
因为你同时是BarPackage的维护者,可以直接用三冒号操作符访问未导出的方法实现,写法更简洁:
#' @importFrom BarPackage Bar Foo <- function (n, x) { replicate(1e6, BarPackage:::Bar.numeric(numeric(n), x)) }
注意该方案仅适合你同时控制两个包代码的场景,若BarPackage后续调整了内部方法的命名规则,需要同步修改Foo包的对应调用。
额外优化建议
如果Bar.numeric的实现支持向量化输入,可以考虑将replicate循环替换为批量生成输入的写法,减少总调用次数,进一步提升运行效率。
内容的提问来源于stack exchange,提问作者Martin Smith
相关产品推荐
相关产品推荐

