You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌套列表中正确使用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)

解决方案

核心问题修正

  1. 深度参数错误:map_depth(example, 2)会直接操作底层的单个data.table,但map_at是用来处理列表的,因此应该将深度设为1,对应外层的每个group(每个group是包含两个data.table的列表)。
  2. 参数传递错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:50:24