Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用rlang将权重传递给glm()_R_Glm_Rlang_Tidyeval - Fatal编程技术网

使用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), ...) )
}