purrr::modify_depth()递归处理不规则列表时无法正常工作
解决purrr::modify_depth()处理不规则列表时的报错问题
我之前也踩过这个坑!当用modify_depth()处理结构不规则的列表时,报错Can't make heads nor tails of this几乎都是因为没正确设置.ragged参数,咱们一步步理清楚:
问题核心
modify_depth()的默认行为(.ragged = FALSE)要求列表的所有分支深度完全一致,如果有某个分支的深度和你指定的.depth不匹配,就会触发这个报错。而手动用str()遍历没问题,是因为你是逐个判断元素深度,没有强制要求所有分支统一。
正确用法:开启.ragged = TRUE
当你的列表结构不规则时,必须显式设置.ragged = TRUE,这个参数的作用是:忽略分支深度不一致的情况,只对所有恰好达到指定.depth层级的元素应用函数。
举个实际的例子:
# 构造一个不规则列表 ragged_list <- list( level1_a = list( level2_x = 1, level2_y = 2 ), level1_b = list( level2_z = list(level3_m = 3, level3_n = 4), level2_w = 5 # 这个元素深度是2,和其他分支的深度不同 ) ) # 错误用法:不设置.ragged会报错 # modify_depth(ragged_list, .depth = 2, ~ .x * 2) # 正确用法:开启.ragged = TRUE library(purrr) result <- modify_depth(ragged_list, .depth = 2, ~ .x * 2, .ragged = TRUE) # 查看结果 str(result)
运行后你会发现:
level1_a下的level2_x和level2_y(深度2)被乘以2level1_b下的level2_w(深度2)被乘以2level1_b下的level2_z(深度2,但它本身是列表,深度3的元素不会被处理,因为我们指定的是深度2)
常见误区提醒
别把.ragged = TRUE理解成“处理深度超过指定值的元素”——它只是允许列表存在不同深度的分支,严格只对恰好处于指定深度的元素应用函数。如果你的需求是对深度≥2的元素都处理,那可能需要用modify_tree()或者自定义递归函数,但你的场景里.ragged = TRUE刚好能解决问题。
内容的提问来源于stack exchange,提问作者maxheld
相关产品推荐
相关产品推荐

