使用purrr的modify_in函数批量修改列表元素报错如何解决
问题原因说明
- 第一个
modify_in写法报错:modify_in()的.where参数仅支持定位单个元素的路径,传入长度大于1的位置向量无法识别对应路径,因此触发报错。 - 第二个循环写法出现列表重复:
map()迭代过程中每次都会对完整的原始列表tib_list执行修改,每次循环返回的是一个修改后的完整列表,最终map()会将3次返回的完整列表拼接为新的嵌套列表,因此出现重复。
正确实现方案
方案1:使用modify_at(最简便)
modify_at原生支持指定多个位置批量修改列表元素,完全匹配需求:
library(purrr) library(dplyr) # 原始列表构造 tib_list <- map(1:3, ~ tibble(col_one = runif(5), col_two = runif(5), col_three = runif(5))) # 对第2、3个元素移除col_one列 result <- modify_at(tib_list, .at = 2:3, ~ select(.x, -col_one))
验证结果:执行map(result, colnames)可以看到,第一个列表元素保留col_one,第2、3个元素已移除该列。
方案2:结合reduce使用modify_in
如果需要坚持用modify_in实现,可以通过reduce迭代修改单个位置,避免返回重复列表:
result <- reduce(2:3, function(current_list, pos) { modify_in(current_list, pos, ~ select(.x, -col_one)) }, .init = tib_list)
方案3:使用map_at
和modify_at逻辑一致,也可以实现相同效果:
result <- map_at(tib_list, .at = 2:3, ~ select(.x, -col_one))
内容的提问来源于stack exchange,提问作者bioinformatics2020
相关产品推荐
相关产品推荐

