簡體   English   中英

從 R 中的列表構建嵌套命名列表

[英]Build nested named list from list in R

我正在嘗試准備稍后在我的腳本中需要的數據結構。 假設我在一個圖形域中,並且我的節點(有時只有 1 個,但大多是 2 個甚至 3 個)有名稱(例如, "left""right""center" )。 名稱存儲在一個變量中:

origin_target_list <- c("left", "center", "right", "")

鑒於上面包含三個項目的列表,我正在嘗試動態創建此數據結構:

origin_target_combinations <- list(
  left = list(    # origin is left
    right = c(),  # target is right
    center = c(), # target is center
    unknown = c() # target is somewhere else / unknown
  ),
  right = list(
    left = c(),
    center = c(),
    unknown = c()
  ),
  center = list(
    left = c(),
    right = c(),
    unknown = c()
  ),
  unknown = list( # origin is unknown
    left = c(),   # target is left
    center = c(), # target is center
    right = c()   # target is right
  )
)

編輯:約束是原點和目標不能相同。 因此,應該組合origin_target_list中的每個元素加上“未知”。

類似地,具有一個元素的列表: origin_target_list <- c("center")只會創建未知情況:

origin_target_combinations <- list(
  unknown = list(
    left = c(),
    center = c(),
    right = c()
  )
)

我知道這是一個復雜的問題,我現在自己正在研究解決方案......我會根據我的嘗試更新這篇文章......

您可以執行以下操作

# assign function to create the list
create_list <- function(args, val = c())
  setNames(
    lapply(args, function(x)
      setNames(rep(list(val), length(args) - 1L), setdiff(args, x))), 
    args)

# use the function
str(create_list(c("left", "center", "right", "unknown")))
#R> List of 4
#R>  $ left  :List of 3
#R>   ..$ center: NULL
#R>   ..$ right : NULL
#R>   ..$ unknown: NULL
#R>  $ center:List of 3
#R>   ..$ left  : NULL
#R>   ..$ right : NULL
#R>   ..$ unknown: NULL
#R>  $ right :List of 3
#R>   ..$ left  : NULL
#R>   ..$ center: NULL
#R>   ..$ unknown: NULL
#R>  $ unknown:List of 3
#R>   ..$ left  : NULL
#R>   ..$ center: NULL
#R>   ..$ right : NULL

# you can change the type and the element names like so
str(create_list(c("cat", "dog", "bird"), numeric()))
#R> List of 3
#R>  $ cat :List of 2
#R>   ..$ dog : num(0) 
#R>   ..$ bird: num(0) 
#R>  $ dog :List of 2
#R>   ..$ cat : num(0) 
#R>   ..$ bird: num(0) 
#R>  $ bird:List of 2
#R>   ..$ cat: num(0) 
#R>   ..$ dog: num(0) 

這個 function 應該做你想做的事。 但是您必須用不僅僅是一個空向量來填充列表元素,因為如果它們為空,它們將再次被刪除。 所以,我用一個包含單個 NA 的向量填充它們:

make_dynlist = function(nodes){
  l = list("unknown"=list("right"=c(NA),
                          "left"=c(NA),
                          "center"=c(NA)))
  if(length(nodes)>1){
    for(n in c(nodes)){
      l[[n]]=list()
      for(d in nodes){
        if(n!=d){
          l[[n]][[d]]=c(NA)
        }
      }
    }
  }
  
  return(l)
}

output 將是:

> make_dynlist(c("left", "center", "right"))
$unknown
$unknown$right
[1] NA

$unknown$left
[1] NA

$unknown$center
[1] NA


$left
$left$center
[1] NA

$left$right
[1] NA


$center
$center$left
[1] NA

$center$right
[1] NA


$right
$right$left
[1] NA

$right$center
[1] NA


> make_dynlist(c("center"))
$unknown
$unknown$right
[1] NA

$unknown$left
[1] NA

$unknown$center
[1] NA

這是一個使用lapply的簡單實現:

make_list <- function(branches)
{
  setNames(lapply(branches, function(origin)
  {
    blank <- list(left = c(), right = c(), center = c(), unknown = c())
    blank[!(names(blank) %in% origin)]
  }), branches)
}

屈服

make_list(c("left", "right", "center", "unknown"))
#> $left
#> $left$right
#> NULL
#> 
#> $left$center
#> NULL
#> 
#> $left$unknown
#> NULL
#> 
#> 
#> $right
#> $right$left
#> NULL
#> 
#> $right$center
#> NULL
#> 
#> $right$unknown
#> NULL
#> 
#> 
#> $center
#> $center$left
#> NULL
#> 
#> $center$right
#> NULL
#> 
#> $center$unknown
#> NULL
#> 
#> 
#> $unknown
#> $unknown$left
#> NULL
#> 
#> $unknown$right
#> NULL
#> 
#> $unknown$center
#> NULL

代表 package (v0.3.0) 於 2020 年 8 月 17 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM