R语言ComplexUpset包绘图报无法分配内存错误问题咨询
问题原因及解决方案
报错核心原因
你使用的19个component理论上最多可生成2^19=52万+种交集组合,ComplexUpset默认会计算所有可能的交集,生成的中间统计矩阵实际占用内存远高于报错提示的176Mb,这才是触发内存错误的核心原因,和设备总RAM无关。UpsetR可以正常绘图是因为它默认只计算出现频率最高的部分交集,不会全量计算所有组合。
另外你当前的列转换逻辑存在隐形风险:across(where(is.numeric), as.logical)会将所有数值列(比如ID列)都转换为逻辑型,虽然本次未影响绘图,但后续调整代码时容易出现意料外的错误。
修复后可直接运行的代码
library(tidyverse) library(ComplexUpset) # 1. 仅筛选component列,避免误操作其他列 component_cols <- str_subset(colnames(df), "^component\\d+$") # 2. 仅将component列的0/1转换为逻辑型 df <- df %>% mutate(across(all_of(component_cols), as.logical)) # 3. 绘制带type堆叠条形的Upset图 upset( data = df, intersect = component_cols, name = "protein", width_ratio = 0.1, # 过滤最小样本数≤10的交集,可根据实际需求调整阈值 min_size = 10, # 最多展示前100个最常见的交集,进一步降低内存占用 max_intersections = 100, # 配置堆叠条形图 base_annotations = list( "Intersection size" = intersection_size( mapping = aes(fill = type), position = "stack" ) + theme(legend.position = "right") ) )
参数调整说明
- 若需要展示更多交集,可适当调大
max_intersections数值,或降低min_size的过滤阈值,根据你的数据分布灵活调整即可。 - 如果调整参数后仍出现内存报错,先将ComplexUpset升级到最新版本,旧版本存在交集计算时的内存泄漏问题。
- 堆叠条形的颜色、标签、图例位置等样式都可以通过常规ggplot2语法修改。
内容的提问来源于stack exchange,提问作者Daniil Khlebnikov
相关产品推荐
相关产品推荐

