首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >heatmap.2错误(gplots)

heatmap.2错误(gplots)
EN

Stack Overflow用户
提问于 2013-05-15 15:31:52
回答 3查看 6.6K关注 0票数 5

我已经转移到一台新服务器上,并在上面安装了R3.0版。(2.14版本中不再提供gplots库)

使用适用于2.14版本的脚本时,我现在遇到了一个生成热图的问题。

在R版本3中,我得到一个错误:

代码语言:javascript
复制
Error in lapply(args, is.character) : node stack overflow
Error in dev.flush() : node stack overflow
Error in par(op) : node stack overflow

在R版本2.14中,我得到一个错误:

代码语言:javascript
复制
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?

我可以通过增加选项(expressions=500000)来解决这个问题

在R版本3中,增加此选项不能解决此问题。而我仍然被同样的错误所困扰。

这两个脚本是相同的:

代码语言:javascript
复制
y=read.table("test", row.names=1, sep="\t", header=TRUE)
hr <- hclust(dist(as.matrix(y)))
hc <- hclust(dist(as.matrix(t(y))))
mycl <- cutree(hr, k=7); mycolhc <- rainbow(length(unique(mycl)), start=0.1, end=0.9); mycolhc     <- mycolhc[as.vector(mycl)] 

install.packages("gplots")
library("gplots", character.only=TRUE)
myheatcol <- redgreen(75)

pdf("heatmap.pdf")
heatmap.2(as.matrix(y), Rowv=as.dendrogram(hr), Colv=as.dendrogram(hc), col=myheatcol,scale="none", density.info="none", trace="none", RowSideColors=mycolhc, labRow=FALSE)
dev.off()

其中"test“是一个tdl文件,包含标题和行名以及一个40*5000 0/1矩阵

任何帮助都将不胜感激

PS:当我将我的数据集减少到2000行时,我不再得到错误。

PSS:将数据集增加到2500行会导致相同的错误;但是,删除所有不具信息性的行(全为1)后,我会得到3700行。使用此数据集不会导致错误。

EN

回答 3

Stack Overflow用户

发布于 2014-09-17 04:04:12

我是gplots包的作者。当一个字节编译的函数有太多的递归调用时,就会出现“节点堆栈溢出”错误。

在这种情况下,之所以会出现这种情况,是因为绘制树状图对象(stats:plotNode)的函数是使用递归算法实现的,并且树状图对象嵌套得很深。

最终,正确的解决方案是修改plotNode以使用迭代算法,这将防止递归深度错误的发生。

在短期内,可以强制stats:plotNode作为解释代码运行,而不是通过讨厌的黑客攻击作为字节编译的代码运行。

食谱如下:

代码语言:javascript
复制
## Convert a byte-compiled function to an interpreted-code function 
unByteCode <- function(fun)
    {
        FUN <- eval(parse(text=deparse(fun)))
        environment(FUN) <- environment(fun)
        FUN
    }

## Replace function definition inside of a locked environment **HACK** 
assignEdgewise <- function(name, env, value)
    {
        unlockBinding(name, env=env)
        assign( name, envir=env, value=value)
        lockBinding(name, env=env)
        invisible(value)
    }

## Replace byte-compiled function in a locked environment with an interpreted-code
## function
unByteCodeAssign <- function(fun)
    {
        name <- gsub('^.*::+','', deparse(substitute(fun)))
        FUN <- unByteCode(fun)
        retval <- assignEdgewise(name=name,
                                 env=environment(FUN),
                                 value=FUN
                                 )
        invisible(retval)
    }

## Use the above functions to convert stats:::plotNode to interpreted-code:
unByteCodeAssign(stats:::plotNode)

## Now raise the interpreted code recursion limit (you may need to adjust this,
##  decreasing if it uses to much memory, increasing if you get a recursion depth error ).
options(expressions=5e4)

## heatmap.2 should now work properly 
heatmap.2( ... )
票数 6
EN

Stack Overflow用户

发布于 2013-05-15 21:31:03

another post中,这是来自stats:::midcache.dendrogram的函数setmidsetmid递归地调用自己,这种递归可能太深了--可能树状图太密集了,在视觉上没有任何意义?你可以通过在错误发生后查看traceback()的最后几行来了解错误发生的位置。

要在这方面取得进一步的进展,您需要能够提供一个minimal reproducible example (使用heatmap而不是heatmap.2,甚至可以根据您对traceback()的解释进一步改进),可能是通过使数据文件可用,或者通过提供一个方法来模拟数据(m <- matrix(runif(1000), 40) ?)以一种可靠地再现错误的方式。

票数 4
EN

Stack Overflow用户

发布于 2013-12-10 00:39:05

此问题(使用heatmap.2函数时出现“节点堆栈溢出”错误)是由于矩阵中的特定列中有太多相同的值而导致的,这会导致R上的递归问题产生错误。

我能建议的(至少我是如何解决我的数据的非常精确的问题的)是在相同的数字周围产生随机数,并用矩阵中的原始数字替换它们:

代码语言:javascript
复制
for (i in 1:nrow(my_matrix)) {
   if (my_matrix[i,my_column]=="100") { # assume i have too many 100 in my_column
      my_matrix[i,my_column]=runif(1,99,101) # replace 100 with nearby values randomly
    }
}

通过这种方式,热图的创建没有任何问题,因为不再有太多相同的数字,而且它实际上也不会影响您的矩阵,因为您可以围绕相同的值选择一个非常小的随机数生成间隔,该间隔仍将反映热图上不可见的颜色变化的原始值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16559250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档