嵌套在mutate()中的map()无法实现Splicing问题求助
问题原因与解决方法
你遇到的情况是:在mutate()中嵌套调用map_dbl()时,用!!!.x展开索引向量传给pluck()会报错“object '.x' not found”,但直接在顶层调用map_dbl()时完全正常。
原因解析
这是因为dplyr的mutate()采用**非标准求值(NSE)**机制:它会先将括号内的表达式解析为quosure对象,而!!!是rlang的非展开运算符,在这个提前解析的阶段,.x还没有被map()绑定到具体的索引向量上,会被当成全局环境中的对象查找,自然找不到。而顶层调用map_dbl()时,表达式直接在map()的函数环境中执行,.x已经被正确绑定,!!!.x就能正常展开。
解决方法
有几种可行的写法可以避开这个问题:
方法1:直接利用pluck()的向量参数特性
pluck()本身支持将索引向量作为第二个参数直接传入,不需要用!!!展开,完美适配mutate()的环境:
idx_df |> mutate(val = map_dbl(idx, ~ pluck(lst, .x)))
方法2:用exec()延迟展开操作
用exec()包裹pluck(),让!!!.x的展开操作延迟到map()的函数环境中执行:
idx_df |> mutate(val = map_dbl(idx, ~ exec(pluck, lst, !!!.x)))
方法3:改用base R的列表索引
如果逻辑简单,直接用base R的[[操作符代替pluck(),同样能绕过NSE的解析问题:
idx_df |> mutate(val = map_dbl(idx, ~ lst[[.x]]))
以上三种写法都能得到正确结果:
#> # A tibble: 1 × 2 #> idx val #> <list> <dbl> #> 1 <int [2]> 3
内容的提问来源于stack exchange,提问作者mpettis
相关产品推荐
相关产品推荐

