如何在R包中为grid构建的gTree设置尺寸计算方法
解决方案
问题根源
你自定义的widthDetails.bHMLegend是grid包widthDetails泛型函数的S3子类实现,当代码作为包加载时,R的S3方法派发机制默认不会检索包命名空间内未注册的S3方法,因此只会调用默认的widthDetails实现返回0宽度。你将方法直接定义在全局环境时,全局环境的方法优先级更高,因此可以正常触发。
具体修改步骤
- 第一步:移除包代码开头的
require()调用
包依赖不能通过require()声明,你需要在包的DESCRIPTION文件中添加以下内容声明依赖:Imports: grid, reshape - 第二步:注册S3方法
如果你使用roxygen2管理包文档和命名空间,在widthDetails.bHMLegend函数上方添加以下标签:
如果你手动管理#' @importFrom grid widthDetails #' @exportS3Method grid::widthDetails bHMLegend widthDetails.bHMLegend <- function(x){ minX0 <- min(do.call(unit.c, lapply(x$children, grobX, theta = 180))) maxX1 <- max(do.call(unit.c, lapply(x$children, grobX, theta = 0))) return(grobWidth(segmentsGrob(x0 = minX0, x1 = maxX1))) }NAMESPACE文件,直接添加以下两行:importFrom(grid, widthDetails) S3method(widthDetails, bHMLegend) - 第三步:重新构建加载包
修改完成后重新运行devtools::load_all()或者重新安装包,再次调用convertUnit(grobWidth(tree), "cm")即可直接返回正确结果。
内容的提问来源于stack exchange,提问作者GreenPepperAvalanche
相关产品推荐
相关产品推荐

