我正在尝试创建一个统一的接口,用于使用{rlang}运行t检验,并且我想使用t.test()
的公式方法。在这样做的时候,我可以使用{rlang}构造一个用于非配对t检验的公式,但不知道如何创建用于配对检验的公式。
library(rlang)
two_sample_t_test <- function(data, x, y, paired, ...) {
x <- ensym(x)
y <- ensym(y)
exec(
t.test,
formula = if (paired) {
new_formula(quote(Pair(x, y)), 1)
} else {
new_formula(y, x)
},
data = data,
...
)
}
# unpaired t-test -------------------------
two_sample_t_test(mtcars, am, wt, paired = FALSE, var.equal = TRUE)
#>
#> Two Sample t-test
#>
#> data: wt by am
#> t = 5.2576, df = 30, p-value = 1.125e-05
#> alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
#> 95 percent confidence interval:
#> 0.8304317 1.8853577
#> sample estimates:
#> mean in group 0 mean in group 1
#> 3.768895 2.411000
# paired t-test -------------------------
two_sample_t_test(mtcars, am, wt, paired = TRUE)
#> Error in model.frame.default(formula = .Primitive("quote")(Pair(x, y) ~ : invalid type (list) for variable 'Pair(x, y)'
创建于2023-09-11使用reprex v2.0.2
1条答案
按热度按时间ercv8c1e1#
在{rlang}中,我们可以使用
expr()
来捕获new_formula
和!!
中的表达式,以提前计算x
和y
,这应该会给予我们想要的结果(输出比我使用eval(bquote(...))
的旧答案好得多,见下文):旧答案
我会尝试使用
eval(bquote(...))
而不是单独使用quote()
,然后通过将x
和y
Package 在.()
中来提前评估它们,并使用data
参数中提供的data.frame
作为eval
的envir
。创建于2023-09-11使用reprex v2.0.2