【发布时间】:2019-01-26 22:30:48
【问题描述】:
我想通过函数将weights 传递给glm(),而不必使用eval(substitute()) 或do.call() 方法,而是使用rlang。
这描述了一个更复杂的底层函数。
# Toy data
mydata = dplyr::tibble(outcome = c(0,0,0,0,0,0,0,0,1,1,1,1,1,1),
group = c(0,1,0,1,0,1,0,1,0,1,0,1,0,1),
wgts = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1)
)
# This works
glm(outcome ~ group, data = mydata)
# This works
glm(outcome ~ group, data = mydata, weights = wgts)
library(rlang)
# Function not passing weights
myglm <- function(.data, y, x){
glm(expr(!! enexpr(y) ~ !! enexpr(x)), data = .data)
}
# This works
myglm(mydata, outcome, group)
# Function passing weights
myglm2 <- function(.data, y, x, weights){
glm(expr(!! enexpr(y) ~ !! enexpr(x)), `weights = !! enexpr(weights)`, data = .data)
}
# This doesn't work
myglm2(mydata, outcome, group, wgts)
(标记要突出显示)。
我知道这里的权重参数是错误的,我尝试了许多不同的方法来做这一切都没有成功。实际函数将传递给purrr:map() 或purrr:invoke() 的版本,这就是为什么我要避免使用简单的do.call()。想法非常感谢。
【问题讨论】: