我有一個用于運行線性模型的包裝函式。我正在使用,但是當我同時使用省略號和命名引數時遇到了意外錯誤。
為什么lm_robust_wrapper3會有錯誤?
library(estimatr)
library(purrr)
f <- list(as.formula("wt ~ mpg"))
map(f, ~lm_robust(formula = .x, data = mtcars)) # works
#> [[1]]
#> Estimate Std. Error t value Pr(>|t|) CI Lower CI Upper
#> (Intercept) 6.047255 0.39068137 15.478739 7.584436e-16 5.2493772 6.8451328
#> mpg -0.140862 0.01802089 -7.816592 1.009640e-08 -0.1776655 -0.1040584
#> DF
#> (Intercept) 30
#> mpg 30
lm_robust_wrapper1 <- function(...){
map(f, ~lm_robust(formula = .x, data = mtcars))
}
lm_robust_wrapper1() # works
#> [[1]]
#> Estimate Std. Error t value Pr(>|t|) CI Lower CI Upper
#> (Intercept) 6.047255 0.39068137 15.478739 7.584436e-16 5.2493772 6.8451328
#> mpg -0.140862 0.01802089 -7.816592 1.009640e-08 -0.1776655 -0.1040584
#> DF
#> (Intercept) 30
#> mpg 30
lm_robust_wrapper2 <- function(...){
lm_robust(..., data = mtcars)
}
lm_robust_wrapper2(formula = f[[1]]) # works
#> Estimate Std. Error t value Pr(>|t|) CI Lower CI Upper
#> (Intercept) 6.047255 0.39068137 15.478739 7.584436e-16 5.2493772 6.8451328
#> mpg -0.140862 0.01802089 -7.816592 1.009640e-08 -0.1776655 -0.1040584
#> DF
#> (Intercept) 30
#> mpg 30
lm_robust_wrapper3 <- function(...){
f <- list(as.formula("wt ~ mpg"))
map(f, ~lm_robust(formula = .x, data = mtcars, ...))
}
lm_robust_wrapper3() # fails
#> Error in model.frame.default(terms(formula, lhs = lhs, rhs = rhs, data = data, : invalid type (language) for variable '(weights)'
由reprex 包(v0.3.0)于 2021 年 10 月 22 日創建
uj5u.com熱心網友回復:
estimatr::lm_robust感到困惑,因為NULL它不是args(estimatr::lm_robust). 您可以使用match.call(),match將引數傳遞給eval在后期它map。現在,與 相關的引數estimatr::lm_robust已正確識別,公式串列f將進入map.
需要將單個公式放入串列中,但您可以通過if / else案例處理來更改它。
lm_robust_wrapper3 <- function(...) {
cl <- match.call()
f <- cl[['f']][-1L]
m <- match(formalArgs(estimatr::lm_robust), names(cl), 0L)
m <- cl[c(1L, m)]
m[[1L]] <- quote(estimatr::lm_robust)
map(f, ~ {
m[['formula']] <- .x
eval(m, parent.frame())
})
}
lm_robust_wrapper3(f=list(wt ~ mpg), data=mtcars)
# [[1]]
# Estimate Std. Error t value Pr(>|t|) CI Lower CI Upper DF
# (Intercept) 6.047255 0.39068137 15.478739 7.584436e-16 5.2493772 6.8451328 30
# mpg -0.140862 0.01802089 -7.816592 1.009640e-08 -0.1776655 -0.1040584 30
lm_robust_wrapper3(f=list(wt ~ mpg, qsec ~ mpg), data=mtcars, alpha=.001)
# [[1]]
# Estimate Std. Error t value Pr(>|t|) CI Lower CI Upper DF
# (Intercept) 6.047255 0.39068137 15.478739 7.584436e-16 5.2493772 6.8451328 30
# mpg -0.140862 0.01802089 -7.816592 1.009640e-08 -0.1776655 -0.1040584 30
#
# [[2]]
# Estimate Std. Error t value Pr(>|t|) CI Lower CI Upper DF
# (Intercept) 15.3547689 0.83511142 18.386491 6.998610e-18 13.64924386 17.0602940 30
# mpg 0.1241366 0.03941595 3.149399 3.688336e-03 0.04363845 0.2046347 30
當f引數中提供no時,它不會非常失敗,只會產生一個空的list(),但您仍然可以stop在函式中定義 a 。
lm_robust_wrapper3(f=NULL, data=mtcars)
# list()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333099.html
下一篇:如何洗掉括號但將文本保留在R中
