R 4.1+函数简写\(x)在purrr::group_map()中无法使用的问题排查
purrr::group_map()使用R 4.1+函数简写语法的问题解决
问题场景
在R 4.1及更高版本中,尝试使用tidyverse推荐的函数简写语法\(x)配合purrr::group_map()时运行失败,但旧的公式写法(~ lm(...))可正常工作。示例代码如下:
library(purrr) # 旧写法可正常运行 mtcars |> group_by(cyl) |> group_map(~ lm(mpg ~ disp + hp, data = .x)) # R版本>=4.1的简写写法无法运行 mtcars |> group_by(cyl) |> group_map(\(x) lm(mpg ~ disp + hp, data = x))
问题原因
group_map()默认会向传入的函数传递两个参数:
- 第一个参数:分组后的数据集(对应公式写法中的
.x) - 第二个参数:当前分组的键值(对应公式写法中的
.y)
使用公式写法时,purrr会自动处理参数匹配,只调用需要的.x;但使用函数简写\(x)时,函数仅定义了一个参数,而group_map()仍会传递两个参数,导致参数不匹配报错。
解决方法
有两种可行的修正方式:
方式1:明确接收两个参数
即使不需要分组键值,也在函数中定义第二个参数,避免参数不匹配:
mtcars |> group_by(cyl) |> group_map(\(x, y) lm(mpg ~ disp + hp, data = x))
方式2:使用.keep = FALSE参数
通过该参数让group_map()仅传递分组后的数据集,不传递分组键值:
mtcars |> group_by(cyl) |> group_map(\(x) lm(mpg ~ disp + hp, data = x), .keep = FALSE)
验证结果
两种修正写法均可正常运行,输出结果与旧公式写法完全一致。
内容的提问来源于stack exchange,提问作者AGeographer
相关产品推荐
相关产品推荐

