如何在R语言中通过循环为列表对象的子元素赋值?
问题描述
我们先创建了5个独立的列表对象:
# 创建列表 for (i in 1:5) { assign(paste0('my_list', i), list(first = NA, second = NA)) } # 此时环境中的对象: > ls() [1] "i" "my_list1" "my_list2" "my_list3" "my_list4" "my_list5"
需求是给每个列表的first元素赋值一个子列表,手动操作的效果如下:
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))
错误尝试
原本尝试用循环结合assign直接修改,但代码只是创建了新的对象,而非修改原有列表的元素:
for (i in 1:5) { assign(paste0('my_list', i, '[[1]]'), list(hello = c(1, 2, 3), world = c(1, 2, 3, 4))) } # 执行后环境中的对象: > 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]]"
解决方案
方法1:结合get()和assign()修改原有列表
先通过get()获取对应列表对象,修改其first元素后,再用assign()把修改后的对象放回环境中:
# 定义要赋值的子列表 sub_list <- list(hello = c(1, 2, 3), world = c(1, 2, 3, 4)) for (i in 1:5) { # 获取当前列表 current_list <- get(paste0('my_list', i)) # 修改first元素 current_list$first <- sub_list # 将修改后的列表放回环境 assign(paste0('my_list', i), current_list) }
验证效果:
> my_list1$first $hello [1] 1 2 3 $world [1] 1 2 3 4
方法2:推荐——用大列表统一管理(更符合R的编程习惯)
单独创建多个命名相似的对象会增加管理成本,建议一开始就把所有列表放到一个大列表中,操作更简便:
# 直接创建包含5个列表的大列表 my_lists <- lapply(1:5, function(x) list(first = NA, second = NA)) # 批量修改每个子列表的first元素 sub_list <- list(hello = c(1, 2, 3), world = c(1, 2, 3, 4)) my_lists <- lapply(my_lists, function(lst) { lst$first <- sub_list return(lst) }) # 访问单个列表的方式:my_lists[[1]]、my_lists[[2]]等 > my_lists[[1]]$first $hello [1] 1 2 3 $world [1] 1 2 3 4
内容的提问来源于stack exchange,提问作者MinChul Park
相关产品推荐
相关产品推荐

