[英]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.