使用rlang将权重传递给glm()
我想通过一个函数将使用rlang将权重传递给glm(),r,glm,rlang,tidyeval,R,Glm,Rlang,Tidyeval,我想通过一个函数将权重传递给glm(),而不必使用eval(substitute())或do.call()方法,而是使用rlang 这描述了一个更复杂的底层函数 玩具数据 mydata=dplyr::tibble(结果=c(0,0,0,0,0,0,0,1,1,1,1,1), 组=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) ) #这很有效 glm(结果组,数据=mydata) #这很有效 glm(结果组,数据=
权重传递给glm()
,而不必使用eval(substitute())
或do.call()
方法,而是使用rlang
这描述了一个更复杂的底层函数
玩具数据
mydata=dplyr::tibble(结果=c(0,0,0,0,0,0,0,1,1,1,1,1),
组=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)
)
#这很有效
glm(结果组,数据=mydata)
#这很有效
glm(结果组,数据=mydata,权重=wgts)
图书馆(rlang)
#不传递权重的函数
myglm问题在于,glm()
可以识别提供给其weights
参数的表达式,但不支持准旋转,因为它使用基quote()
/替换()
/eval()
机制而不是rlang
绕过它的一种方法是组合整个glm
表达式,然后对其求值。您可以使用…
提供可选参数
myglm2 <- function( .data, y, x, weights, ... ) {
myglm <- expr( glm(!!enexpr(y) ~ !!enexpr(x), data=.data,
weights = !!enexpr(weights), ...) )
eval(myglm)
}
myglm2(mydata, outcome, group)
# Call: glm(formula = outcome ~ group, data = .data)
myglm2(mydata, outcome, group, wgts)
# Call: glm(formula = outcome ~ group, data = .data, weights = wgts)
myglm2(mydata, outcome, group, wgts, subset=7:10)
# Call: glm(formula = outcome ~ group, data = .data, weights = wgts,
# subset = ..1)
# While masked as ..1, the 7:10 is nevertheless correctly passed to glm()
myglm2我将提取函数中的expr+eval内容(例如,value感谢您的建议,@lionel.function(e){eval(enexpr(e))}
给了我无法将类的“rlang\u伪数据代词”强制到一个data.frame
错误。我可以使用eval\u-tidy(enquo(e))绕过它
相反。嗯……这个错误非常令人惊讶,可能是您输入了错别字?顺便说一下,直接传递点,不要使用!!!eExprs(…)
。将捕获的点拼接到裸表达式而不是QUOSURE中尤其糟糕,因为您会丢失正确的环境。如果您直接传递点,它看起来更干净、更健壮、更准确。哎呀,您完全正确,我忘记转发调用程序env:s。正确的函数是值,谢谢,@lionel。我更新了我会回答你所有的建议。
value <- function( e ) {eval(enexpr(e), caller_env())}
myglm2 <- function( .data, y, x, weights, ... ) {
value( glm(!!enexpr(y) ~ !!enexpr(x), data=.data,
weights = !!enexpr(weights), ...) )
}