如何在R中使用循环将列表分配给列表对象?

b4lqfgs4  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(122)

假设我们有五个list对象:

# create the lists
for (i in 1:5) {
 assign(paste0('my_list', i), list(first = NA, second = NA))
}

# then, we have my_list1 - my_list5
> ls()
[1] "i" "my_list1" "my_list2" "my_list3" "my_list4" "my_list5"

这里,我想给每个列表的“第一个”赋值一个列表。也就是说,我想做的是

my_list1$first <- list(hello = c(1, 2, 3), world = c(1, 2, 3, 4))
my_list2$first <- list(hello = c(1, 2, 3), world = c(1, 2, 3, 4))
my_list3$first <- list(hello = c(1, 2, 3), world = c(1, 2, 3, 4))
my_list4$first <- list(hello = c(1, 2, 3), world = c(1, 2, 3, 4))
my_list5$first <- list(hello = c(1, 2, 3), world = c(1, 2, 3, 4))

我想下面的代码可以工作:

for (i in 1:5) {
  assign(paste0('my_list', i, '[[1]]'), list(hello = c(1, 2, 3), world = c(1, 2, 3, 4)))
}

但是,您知道,该命令只是创建名为my_list1[[1]]my_list1[[1]]等的其他列表:

> ls()
 [1] "i" "my_list1" "my_list1[[1]]" "my_list2" "my_list2[[1]]" "my_list3" "my_list3[[1]]" "my_list4"     
 [9] "my_list4[[1]]" "my_list5" "my_list5[[1]]"

那么,我怎样才能用loop完成我想要的工作呢?

3pvhb19x

3pvhb19x1#

这些列表可以通过名称从.GlobalEnv访问:

for (i in 1:5) {
  .GlobalEnv[[paste0('my_list', i)]]$first <- list(hello = c(1, 2, 3), world = c(1, 2, 3, 4))
}
my_list1
# $first
# $first$hello
# [1] 1 2 3
# 
# $first$world
# [1] 1 2 3 4
# 
# 
# $second
# [1] NA

但是最好将所有这些my_list*保存在一个列表中,这样以后就可以轻松地操作它们。

o2g1uqev

o2g1uqev2#

您可以get()每个列表,操作它,然后重新-assign()

for (i in 1:5) {
  l <- get(paste0('my_list', i))
  l[[1]] <- list(hello = c(1, 2, 3), world = c(1, 2, 3, 4))
  assign(paste0('my_list', i), l)
}

my_list1
$first
$first$hello
[1] 1 2 3

$first$world
[1] 1 2 3 4

$second
[1] NA

也就是说,将列表存储在上级列表中而不是全局环境中会使它们更容易使用:
一个二个一个一个

相关问题