如何向purrr的map函数传递完整参数向量处理嵌套tibble
问题原因
purrr的map2函数会并行遍历两个输入参数的最外层元素,你直接传入原子向量c(5,10)时,函数会把向量的每个元素当成独立的遍历单元:第一次迭代给myf传5作为params,第二次传10作为params,不仅params长度不足导致params[2]取到NA,还会因为你的嵌套数据有3行(3个cyl分组),而参数向量只有2个元素,长度不匹配最终报错。
解决方法
核心逻辑是:如果你要把完整向量作为单个参数传入,需要将其包裹在列表中,map系函数只会遍历列表的最外层元素,列表内的单个向量会作为整体传入处理函数。
方案1:所有行共享同一个固定参数
不需要用map2,直接在map的匿名函数内传入固定参数即可:
mtcars %>% group_by(cyl) %>% nest() %>% mutate( newold = map(data, ~ myf(.x, params = c(5, 10))) )
方案2:支持每行使用不同的参数向量
如果需要参数随每行变化,把参数封装为列表列,每一行的列表元素就是对应行要传入的完整参数向量:
mtcars %>% group_by(cyl) %>% nest() %>% # 可自定义每个分组的参数,此处示例3个分组分别用不同的参数 mutate(params = list(c(5, 10), c(2, 7), c(8, 15))) %>% mutate(newold = map2(data, params, myf))
如果所有行用同一个参数,也可以用长度为1的列表自动回收:
mtcars %>% group_by(cyl) %>% nest() %>% mutate( params = list(c(5, 10)), # 长度1的列表会自动填充到所有行 newold = map2(data, params, myf) )
内容的提问来源于stack exchange,提问作者gregmacfarlane
相关产品推荐
相关产品推荐

