R语言中命名参数与省略号(...)共用为何导致lm_robust封装函数报错
错误原因
这个报错的核心是purrr公式匿名函数(~开头定义的匿名函数)的作用域优先级问题:
- 你在
~lm_robust(formula = .x, data = mtcars, ...)的函数体内部写的...,优先归属这个~定义的匿名函数本身,不会自动继承外层lm_robust_wrapper3的参数。 - purrr对公式匿名函数做了特殊处理,内部未绑定的
...会捕获到隐式的语言对象,这个对象被lm_robust误识别为weights参数,而语言类型的对象不符合参数要求,就触发了类型错误。
修复方案
有两种可行的修改方式:
方案1:改用普通匿名函数
普通匿名函数的作用域查找规则符合预期,内部的...会自动查找外层wrapper的参数:
lm_robust_wrapper3_fix1 <- function(...){ f <- list(as.formula("wt ~ mpg")) map(f, function(x) lm_robust(formula = x, data = mtcars, ...)) }
方案2:将外层...传入map的参数列表
map本身的...参数会自动将传入的内容转发给每一次迭代的函数调用,不需要写在公式匿名函数内部:
lm_robust_wrapper3_fix2 <- function(...){ f <- list(as.formula("wt ~ mpg")) map(f, ~lm_robust(formula = .x, data = mtcars), ...) }
内容的提问来源于stack exchange,提问作者John-Henry
相关产品推荐
相关产品推荐

