【问题标题】:How to fill a list with a recursive function in R?如何用 R 中的递归函数填充列表?
【发布时间】:2013-09-04 06:43:53
【问题描述】:

我正在使用 HAC(分层凝聚聚类)。我有一个树状图,我正在尝试将元素保存到一个文件中,以进行后验分析(按集群为元素分配代码)。

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

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

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)

欢迎提出任何建议。

最好的问候,

弗拉基米尔。

【问题讨论】:

    标签: r list recursion dendrogram


    【解决方案1】:

    评论:请发布一个可重现的示例。

    快速回答: 使用:

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

    你试过了吗?

    unlist(lista)
    

    【讨论】:

    • 非常感谢。代码运行良好。我做了这个改变:elementos
    【解决方案2】:

    您的函数假定 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         
    

    【讨论】:

    • 谢谢。连接不起作用,因为我需要保留列表结构和列表中包含的对象。
    • 如果您使用 c() 添加列表并且不想添加列表的元素但列表作为单个项目添加,则必须在列表周围放置另一个 list()。比较 c(list(1,2), list(3,4))c(list(list(1,2)), list(list(3,4)) )
    • 谢谢,我也试试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2021-12-11
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多