R调用plot_contact绘图报错找不到color.palette函数如何解决
R语言plot_contact函数运行报错排查方案
问题场景
在R环境中定义用于绘制基因组接触矩阵的自定义函数如下:
plot_contact <- function(mat, zlim=NULL, mode=c('square','upper','lower'), title='', widths=c(1,4), heights=widths, useRaster=T, restore.par=T, image.only=F, value=F, color.palette="WhBlRdYl", under.color=color.palette(101)[1], over.color=color.palette(101)[101], na.color=under.color, cex=0.5, ...)
已提前加载ggplot2、viridis包,执行函数调用命令:
plot_contact(balanced_X_50000_600)
触发如下报错:
Error in color.palette(101) : could not find function "color.palette"
报错根因
- 函数参数定义存在逻辑缺陷:形参
color.palette的默认值是字符串"WhBlRdYl",但同函数内under.color、over.color的默认值直接将color.palette作为函数调用,R解析默认参数时不会自动将字符串转换为对应函数,会直接在全局环境搜索名为color.palette的函数,搜索失败就抛出找不到函数的错误。 - 依赖包未加载:
WhBlRdYl是HiC数据分析包HiTC内置的调色板函数,不属于ggplot2、viridis的内置函数,未安装加载对应包时,环境中不存在这个调色板函数。
解决步骤
- 第一步:安装加载提供目标调色板的依赖包
执行如下命令安装加载HiTC包:
加载完成后可单独执行# 未安装BiocManager的话先执行 install.packages("BiocManager") if (!require("HiTC", quietly = TRUE)) { BiocManager::install("HiTC") } library(HiTC)WhBlRdYl(101)测试,若正常返回101个十六进制色值,说明调色板函数加载成功。 - 第二步:修正自定义函数的参数定义
原函数参数存在字符串和函数混用、参数名与函数名冲突的问题,将参数默认值改为显式指定调色板函数即可,修正后的函数头参考:
如果不想全局加载HiTC包,直接用plot_contact <- function(mat, zlim=NULL, mode=c('square','upper','lower'), title='', widths=c(1,4), heights=widths, useRaster=T, restore.par=T, image.only=F, value=F, color.palette=HiTC::WhBlRdYl, under.color=color.palette(101)[1], over.color=color.palette(101)[101], na.color=under.color, cex=0.5, ...)HiTC::WhBlRdYl的双冒号写法显式调用包内函数即可,不会出现环境找不到函数的问题。 - 可选替代方案:如果不想依赖HiTC包,可直接替换为已加载的viridis包内置调色板,修改
color.palette参数默认值即可,示例:# 替换为viridis调色板的函数定义 plot_contact <- function(mat, zlim=NULL, mode=c('square','upper','lower'), title='', widths=c(1,4), heights=widths, useRaster=T, restore.par=T, image.only=F, value=F, color.palette=viridis::viridis, under.color=color.palette(101)[1], over.color=color.palette(101)[101], na.color=under.color, cex=0.5, ...) - 第三步:重新加载修正后的自定义函数,再执行
plot_contact(balanced_X_50000_600)即可正常出图。
内容的提问来源于stack exchange,提问作者Wang Ming
相关产品推荐
相关产品推荐

