2013-05-15 13 views
5

Iveは、新しいサーバーとInstalled Rバージョン3.0に移行しました。 (gplotsライブラリは2.14では使用できなくなりました)ヒートマップのエラー.2(gplots)

バージョン2.14で動作していたスクリプトを使用して、ヒートマップを生成する際に問題が発生しました。

Rバージョン2.14では
Error in lapply(args, is.character) : node stack overflow 
Error in dev.flush() : node stack overflow 
Error in par(op) : node stack overflow 

私はエラーを取得する:Rバージョン3では

私はエラーを取得する私はオプション増やすことで解決することができます

Error: evaluation nested too deeply: infinite recursion/options(expressions=)? 

(式= 500000)

Rバージョン3では、このオプションを増やしても問題は解決されません。 そして、私はまだ同じエラーで立ち往生しています。

スクリプトはどちらも同じである。

「テスト」がヘッダと行名とTDLファイルと40 * 5000 0/1マトリックス

任意の助けをいただければ幸いである

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() 

PS:データセットを2000行に減らすと、エラーは発生しなくなりました。

PSS:データセットを2500行に増やすと、同じエラーが発生します。しかし、すべての非有益な行(すべて1)を削除すると私に3700行が残されました。このデータセットを使用してもエラーは発生しませんでした。

答えて

4

another postでは、stats:::midcache.dendrogramの機能setmidです。 setmidは再帰的に呼び出しており、この再帰は深すぎる可能性があります。おそらく、樹状図は視覚的には意味がありません。エラーが発生した後、traceback()の最後の数行を見ると、エラーの発生場所がわかります。

これでさらに進歩を遂げるために、あなたは()トレースバック(のあなたの解釈に基づいてheatmapではなくheatmap.2、あるいはより洗練を使用して)minimal reproducible exampleを提供できるようにする必要があり、おそらくデータファイルを利用可能にすることによって、またはエラーを確実に再現する方法でデータをシミュレートするためのレシピ(m <- matrix(runif(1000), 40)?)を提供します。

+0

確かに、それはおそらく再帰の問題です:

は、ここでのレシピです。私は行列からこの非有益なデータを削除し、これは確かに問題を解決します。ご回答有難うございます。 –

3

この問題(heatmap.2関数を使用しているときにノードスタックのオーバーフローエラー)は、行列の特定の列の値が多すぎるために発生し、エラーが発生するRで再帰的な問題が発生します。

私は(私は私のデータのために私の非常に正確な問題を解決し、少なくともどのようにする)を提案することができますが、同一の数字の周りに乱数を生成し、マトリックスの元の数字に置き換えることです:

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 
    } 
} 

このようにヒートマップは何も問題なく作成されます。同一の数値があまりに多くないため、乱数生成のための非常に小さな間隔を選択することができるため、実質的に行列に影響しません。ヒートマップ上の目に見えない色の変化を元の値に反映させます。

6

私はgplotsパッケージの著者です。'ノードスタックオーバーフロー'エラーは、バイトコンパイルされた関数の再帰呼び出しが多すぎる場合に発生します。

この場合は、樹状図オブジェクト(stats ::: plotNode)をプロットする関数が再帰アルゴリズムを使用して実装され、樹状図オブジェクトが深くネストされているために発生します。

最終的には、反復アルゴリズムを使用するようにplotNodeを修正することが適切な解決策であり、再帰深度エラーが発生するのを防ぎます。

短期間では、統計情報::: plotNodeを、不快なハッキングを介してバイトコンパイルされたコードではなく、インタープリットされたコードとして実行することが可能です。 1300行が同一であるとして

## 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(...) 
関連する問題