制作自定义函数句柄嵌套列表

Make custom function handle nested lists

提问人:PsychometStats 提问时间:5/24/2022 最后编辑:user438383PsychometStats 更新时间:5/24/2022 访问量:47

问:

可重现示例:2 个嵌套列表,定义如下,具有各自的并列名称

嵌套列表 1 包含 2 个尺寸为 [2,3] 和 [3,5] 的 DF

list1 <- list(as.data.frame(matrix(nrow = 2, ncol = 3)), as.data.frame(matrix(nrow = 3, ncol = 5)))
colnames(list1[[1]]) <- c("M1", "M2", "M3")
colnames(list1[[2]]) <- c("X1", "X2", "X3", "X4", "X5")
list1

嵌套列表 2 包含 2 个 [3,4] 和 [2,5] 维度的 DFS

list2 <- list(as.data.frame(matrix(nrow = 3, ncol = 4)), as.data.frame(matrix(nrow = 2, ncol = 5)))
colnames(list2[[1]]) <- c("L1", "L2", "L3", "L4")
colnames(list2[[2]]) <- c("Z1", "Z2", "Z3", "Z4", "Z5")
list2

自定义函数,采用每个 df 的并列并生成字符串(例如“F1 =~ M1 + M2 + M3”)

foo_gen_CFA_syn = function(data){ # arg: data = individual list with nested dataframes  
    
    syntax_of_X_CFA_models <- vector(mode = "character", length = length(data))

    for(i in 1:length(data)){
        syntax_of_X_CFA_models[i] <- paste0("F", sep = "", i, sep = " =~ ", paste(colnames(data[[i]]), collapse = " + "))
    }
    
    return(syntax_of_X_CFA_models)
}

这适用于列表 1 和列表 2 单独使用,并生成以下输出

> foo_gen_CFA_syn(data = list1)
[1] "F1 =~ M1 + M2 + M3"           "F2 =~ X1 + X2 + X3 + X4 + X5"
> foo_gen_CFA_syn(data = list2)
[1] "F1 =~ L1 + L2 + L3 + L4"      "F2 =~ Z1 + Z2 + Z3 + Z4 + Z5"

也可以同时使用列表 1 和列表 2

foo_gen_CFA_syn(data = c(list1, list2))
    [1] "F1 =~ M1 + M2 + M3"           "F2 =~ X1 + X2 + X3 + X4 + X5" "F3 =~ L1 + L2 + L3 + L4"     
    [4] "F4 =~ Z1 + Z2 + Z3 + Z4 + Z5"

问题:我想指定一个包含所有列表的嵌套列表,而不是提供列表的向量。像下面这样的东西

list3 <- list(list1, list2)

但这就是它中断并产生错误输出的地方

> foo_gen_CFA_syn(data = list3)
[1] "F1 =~ " "F2 =~ "
R 字符串 列表 函数 nested-lists

评论

2赞 5/24/2022
你希望结果是什么?怎么样 ?或者也许围绕它?lapply(list3, foo_gen_CFA_syn)unlist()

答:

1赞 jpsmith 5/24/2022 #1

添加到函数中:unlist(data, recursive = FALSE)

foo_gen_CFA_syn = function(data){ # arg: data = individual list with nested dataframes  
 
  data <- unlist(data, recursive = FALSE)
   
  syntax_of_X_CFA_models <- vector(mode = "character", length = length(data))
  for(i in 1:length(data)){
    syntax_of_X_CFA_models[i] <- paste0("F", sep = "", i, sep = " =~ ", paste(colnames(data[[i]]), collapse = " + "))
  }
  
  return(syntax_of_X_CFA_models)
}

输出:

foo_gen_CFA_syn(list3)
#"F1 =~ M1 + M2 + M3"           "F2 =~ X1 + X2 + X3 + X4 + X5" "F3 =~ L1 + L2 + L3 + L4"      "F4 =~ Z1 + Z2 + Z3 + Z4 + Z5"