You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:15:08