R语言purrr包pmap报错:.z已定义却提示未找到,如何解决?
解决purrr::pmap()中".z not found"的错误
问题原因
你遇到的报错核心在于:pmap的lambda表达式(~语法)中,参数是按位置用..1、..2、..3引用的,而非.x/.y/.z。你在list()里给元素命名为.x/.y/.z只是给列表元素打了标签,但lambda函数并不会自动将这些标签识别为可用变量,因此调用.z时R找不到该对象。
解决方法
以下是几种无需修改make_chart函数参数定义的解决方案:
方案1:使用位置引用符..1/..2/..3
直接用位置序号对应列表中的元素,替换原来的.x/.y/.z:
pmap(list(mtcars %>% dplyr::select(matches(x_variables)), x_variables, mtcars %>% dplyr::select(mpg)), ~mtcars %>% make_chart(x = ..1, xtitle = ..2, y = ..3))
方案2:显式定义匿名函数参数
放弃~语法,改用function(.x, .y, .z)显式声明参数,这样就能直接使用你习惯的命名:
pmap(list(mtcars %>% dplyr::select(matches(x_variables)), x_variables, mtcars %>% dplyr::select(mpg)), function(.x, .y, .z) { mtcars %>% make_chart(x = .x, xtitle = .y, y = .z) })
方案3:给列表元素命名为make_chart的参数名
将list()中的元素命名为make_chart的参数名(除data外),lambda中直接使用对应名字:
pmap(list(x = mtcars %>% dplyr::select(matches(x_variables)), xtitle = x_variables, y = mtcars %>% dplyr::select(mpg)), ~mtcars %>% make_chart(x = x, xtitle = xtitle, y = y))
补充说明
pmap的.x/.y/.z是函数的参数名(用于接收输入列表),并非lambda内部的变量名。当使用~创建匿名函数时,R默认用..1(第一个输入)、..2(第二个输入)等作为位置参数的别名,这是你之前混淆的关键点。
内容的提问来源于stack exchange,提问作者J.Sabree
相关产品推荐
相关产品推荐

