如何将R向量值无视嵌套结构与名称倒入列表对象?
问题
我们有一个嵌套层级不同的列表对象list_tmp,结构如下:
> list_tmp $clinic $clinic$trial $clinic$trial$patient A B [1,] 0 0 [2,] 0 0 $clinic$result C [1,] 0 [2,] 0 $test D [1,] 0 [2,] 0
list_tmp的定义代码:
list_tmp <- list( clinic = list( trial = list( patient = matrix(0, nrow = 2, ncol = 2, dimnames = list(NULL, c("A", "B"))) ), result = matrix(0, nrow = 2, ncol = 1, dimnames = list(NULL, c("C"))) ), test = matrix(0, nrow = 2, ncol = 1, dimnames = list(NULL, c("D"))) )
现在需要实现:不考虑子列表名称或嵌套层级,按行-列方向(先填充矩阵每一列的所有行,再填下一列)将向量值“倒入”该列表对象。填充会在向量元素耗尽或列表遍历完成时停止,实际场景中向量元素数与列表所有矩阵“单元格”总数相等。
例如,使用向量vec <- c(1,2,3,4,5,6,7,8)填充后,结果如下:
> filled_list $clinic $clinic$trial $clinic$trial$patient A B [1,] 1 3 [2,] 2 4 $clinic$result C [1,] 5 [2,] 6 $test D [1,] 7 [2,] 8
解决方案
可以通过递归遍历列表的方式定位所有矩阵元素,按顺序将向量值填充进去。以下是具体实现代码:
# 定义递归填充函数 fill_list <- function(lst, vec) { pos <- 1 # 记录当前使用到的向量位置 # 递归处理函数 recurse <- function(x) { if (is.matrix(x)) { # 计算当前矩阵需要的元素数量 elem_count <- length(x) # 按列填充矩阵(R中矩阵的[]赋值默认按列顺序) x[] <- vec[pos:(pos + elem_count - 1)] # 更新位置指针 pos <<- pos + elem_count return(x) } else if (is.list(x)) { # 递归处理子列表 lapply(x, recurse) } else { # 非矩阵/列表元素直接返回 return(x) } } # 执行递归并返回结果 recurse(lst) } # 测试示例 vec <- c(1,2,3,4,5,6,7,8) filled_list <- fill_list(list_tmp, vec) # 查看填充后的结果 print(filled_list)
代码说明
- 递归遍历:通过内部函数
recurse遍历列表的每一层元素,自动适配任意嵌套层级。 - 矩阵填充:遇到矩阵时,计算其元素总数,从向量中取出对应长度的片段,通过
x[]赋值(默认按列顺序填充,符合示例中的行-列方向要求)。 - 位置跟踪:使用
<<-操作符更新位置指针,确保向量元素按顺序依次填充到下一个矩阵。
内容的提问来源于stack exchange,提问作者Village.Idyot
相关产品推荐
相关产品推荐

