如何让R中的lapply/sapply输出带命名的列表?
如何让R中的lapply/sapply输出带命名的列表?
嗨,我来帮你搞定这个问题!你想要的是用lapply或sapply生成带有variables里原名称的列表对吧?咱们一步步来解决:
首先看你用lapply的情况:它确实能正确提取对应元素,但返回的是没有命名的列表。要给这个列表加上你想要的名字,只需要用setNames()函数把variables中的值作为列表的名称即可,代码如下:
input <- list("Subject-Identifier" = c("1022", "1023", "1024"), "Next-Screening" = c("A", "B", "C")) variables <- c("Subject Identifier", "Next Screening") res <- setNames(lapply(variables, function(x){ input[[stringr::str_replace_all(x, " ", "-")]] }), variables)
运行后就能得到你想要的结构:
$`Subject Identifier` [1] "1022" "1023" "1024" $`Next Screening` [1] "A" "B" "C"
再来说sapply的问题:你之前用sapply得到了矩阵,是因为sapply默认会简化结果(当每个元素长度一致时,会把列表转为矩阵/数据框)。如果想让它保持列表结构并保留命名,只需要加上SIMPLIFY = FALSE参数就行(USE.NAMES = TRUE其实是默认值,加上更明确):
res <- sapply(variables, function(x){ input[[stringr::str_replace_all(x, " ", "-")]] }, SIMPLIFY = FALSE, USE.NAMES = TRUE)
运行这段代码后,同样能得到带命名的列表结构,不会被简化成矩阵。
另外你提到这是Shiny中的响应式input元素,放心,这两种方法完全适用,只要input的结构和你示例中的一致就没问题~
备注:内容来源于stack exchange,提问作者mandmeier
相关产品推荐
相关产品推荐

