4

私はHAC(階層的凝集クラスタリング)を使用しています。私は系統樹を持っていて、要素をファイルに保存して事後分析を行おうとしています(クラスターごとに要素にコードを割り当てます)。

デンドログラムの分岐を取り、要素の単一のリストを返す再帰関数があります。

私の問題は次のとおりです。関数がリストを返すとき、各要素が適切に追加されているにもかかわらず、ブランチの要素の1つだけが含まれています。これが私のコードです:

lista_interna<-function(lista,elementos){
  print(paste("Tam El. ",length(elementos),""))
  for (i in 1:length(lista)){
    if(typeof(lista[[i]])=="integer"){
      print("agrega agrega...")
      elementos[[length(elementos)+1L]]<-lista[[i]]
    }else if(typeof(lista[[i]])=="list"){
      print("Hace Recall....")
      Recall(lista[[i]],elementos);
    }
  }
  print(elementos) # when I print here the list, contains all elements
  return (elementos)
}

どこ:

  • lista: 樹状図ブランチです
  • elementos: 結果のリスト (提供されたブランチのすべての要素を含む)

関数を呼び出すと、結果は 1 つの要素 (最初の葉) を持つリストになります。

empty<-list()
res<-lista_interna(dendrogram_branch,empty)

どんな提案でも大歓迎です。

よろしくお願いします、

ウラジミール。

4

2 に答える 2

1

コメント: 再現可能な例を投稿してください。

簡単な答え: 使用:

elementos <- Recall(lista[[i]],elementos)

これを試しましたか?

unlist(lista)
于 2013-09-04T08:47:39.257 に答える
0

あなたの関数は、Rが参照渡しのセマンティクスを使用していると想定していますが、これは間違っています。リストを関数に渡して変更しても、元のリストは変更されません。

次の例のように、Recall の戻り値を使用して結果を連結する必要があります。

f = function (x) { 
       if (x <=0 ) {
          return( c() )
       } else {
         return( c(Recall(x-1),x) )
       }
    }

# f(5)
# [1] 1 2 3 4 5         
于 2013-09-04T08:47:27.650 に答える