如何在嵌套列表中正确使用purrr::map_at处理数据表?
问题:嵌套列表中对指定data.table映射函数生成图表
我有一个嵌套列表,底层元素是data.table,需要将highcharter::data_to_boxplot映射到其中名为"all"的表上(不同表格需要传递不同参数,因此必须用map_at或map_if),但对purrr语法不熟悉,尝试的代码都无法正确实现需求。
示例数据
library(data.table) library(purrr) example = list( group1 = list( all = data.table( x = 1:10, y = 10:1), not_all = data.table( x2 = 11:20, y2 = 20:11) ), group2 = list( all = data.table( x = 1:10, y = 10:1), not_all = data.table( x2 = 11:20, y2 = 20:11) ), group3 = list( all = data.table( x = 1:10, y = 10:1), not_all = data.table( x2 = 11:20, y2 = 20:11) ), group4 = list( all = data.table( x = 1:10, y = 10:1), not_all = data.table( x2 = 11:20, y2 = 20:11) ) )
尝试的错误代码及问题
# 错误:character indexing requires a named object map_depth(example, 2, map_at(., "all", data_to_boxplot, variable = x)) # 输出原列表,未执行预期转换 map_depth(example, 2, ~map_at(., "all", data_to_boxplot, variable = x)) # 错误:argument ".f" is missing, with no default map_depth(example, 2) %>% map_at(., "all", data_to_boxplot, variable = x)
解决方案
核心问题修正
- 深度参数错误:
map_depth(example, 2)会直接操作底层的单个data.table,但map_at是用来处理列表的,因此应该将深度设为1,对应外层的每个group(每个group是包含两个data.table的列表)。 - 参数传递错误:
data_to_boxplot的variable参数需要传入列名字符串(如"x"),而非裸变量x,否则会尝试寻找环境中的x变量导致错误。
正确代码
仅处理"all"表
library(highcharter) # 方法1:用map遍历外层group,再用map_at处理指定表 result <- map(example, ~map_at(.x, "all", data_to_boxplot, variable = "x")) # 方法2:用map_depth指定深度1,配合lambda函数 result <- map_depth(example, 1, ~map_at(.x, "all", data_to_boxplot, variable = "x"))
对不同表传递不同参数
如果需要对"not_all"表传递另一组参数,可以链式调用map_at:
result <- map(example, ~ .x %>% map_at("all", data_to_boxplot, variable = "x") %>% map_at("not_all", data_to_boxplot, variable = "x2"))
错误原因解释
- 第一个错误:深度2对应单个data.table,
map_at无法对其进行列表索引,且未用lambda函数绑定上下文,导致.引用错误。 - 第二个错误:同样深度错误,
map_at对单个data.table操作时,"all"不是其列名,因此无任何转换,返回原数据。 - 第三个错误:
map_depth必须传入映射函数(第三个参数),缺失时直接报错。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

