R语言Gmisc包alignHorizontal无法传入盒对象列表问题咨询
Gmisc包中向alignHorizontal传入盒对象列表实现批量对齐的方案
alignHorizontal 函数本身的参数设计只接受单个grob对象作为待对齐目标,直接传入存储多个盒对象的列表会触发类型校验报错,可通过以下两种稳定方案实现批量对齐,不需要修改包源码:
方案1:lapply遍历批量对齐(兼容性最好)
遍历列表内的每个盒对象单独执行对齐操作,处理后重组为和原结构、命名完全一致的列表,后续连线、排布操作不需要重新匹配元素:library(Gmisc) library(grid) # 基础流程图初始化 a.names <- list("i1", "i2", "i3") a <- list(boxGrob("item 1"), boxGrob("item 2"), boxGrob("item 3") ) names(a) <- a.names b <- spreadHorizontal(a) names(b) <- a.names # 批量对齐核心逻辑 a_aligned <- lapply(a, function(x) alignHorizontal(reference = b$i1, x)) # 垂直排布对齐后的盒组 a_vertical <- spreadVertical(a_aligned, .from = 0.9, .to = 0.6) # 输出绘图 grid.newpage() b a_vertical方案2:do.call拆包传参(代码更简洁)
alignHorizontal支持同时传入多个待对齐grob作为独立参数,可通过do.call将列表自动拆分为独立参数传入函数,省略显式循环:# 组装调用参数:第一个为参考盒,后续为所有待对齐盒 call_params <- c(list(reference = b$i1), a) a_aligned2 <- do.call(alignHorizontal, call_params) a_vertical2 <- spreadVertical(a_aligned2, .from = 0.9, .to = 0.6)
注意:使用do.call方案时需保证待对齐列表的元素名不会和
alignHorizontal的内置参数名(如reference、.alignment_method等)重名,否则会出现参数匹配错误。两种方案返回的排布结果完全一致,兼容Gmisc 1.0及以上所有正式版本。
内容的提问来源于stack exchange,提问作者Steffen
相关产品推荐
相关产品推荐

