首页 文章

如何用R中的递归函数填充列表?

提问于
浏览
3

我正在使用HAC(Hierarchical Agglomerative Clustering) . 我有一个树形图,我正在尝试将元素保存到文件中,以进行后验分析(通过聚类为元素分配代码) .

我有一个递归函数,它接受树形图的一个分支并返回一个元素列表 .

我的问题如下,当函数返回列表时,它只包含我的分支的一个元素,尽管每个元素都正确附加 . 这是我的代码:

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:是结果列表(包含所提供分支的所有元素)

如果调用该函数,结果是一个包含一个元素的列表(第一个叶子):

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

任何建议都将受到欢迎 .

最好的祝福,

弗拉基米尔 .

2 回答

  • 0

    您的函数假定R正在使用错误引用的call-by-reference语义 . 将列表传递给函数并进行修改时,原始列表不会更改 .

    您需要做的是使用Recall的返回值并连接结果,如下例所示:

    f = function (x) { 
           if (x <=0 ) {
              return( c() )
           } else {
             return( c(Recall(x-1),x) )
           }
        }
    
    # f(5)
    # [1] 1 2 3 4 5
    
  • 0

    评论:请发布一个可重复的例子 .

    快速回答:使用:

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

    你试过这个吗?

    unlist(lista)
    

相关问题