1) Используйте переформулировку для создания формулы. do.call
необходим для того, чтобы строка Call: на выходе выглядела красиво, но если вас это не волнует, вы можете использовать более короткую версию, показанную в (3).
run_anova <- function(var1, var2, df) {
fo <- reformulate(var2, var1)
do.call("aov", list(fo, substitute(df)))
}
run_anova("Sepal.Width", "Petal.Length", iris)
, давая
Call:
aov(formula = Sepal.Width ~ Petal.Length, data = iris)
Terms:
Petal.Length Residuals
Sum of Squares 5.196047 23.110887
Deg. of Freedom 1 148
Residual standard error: 0.3951641
Estimated effects may be unbalanced
2) Хотя использование eval
не рекомендуется, альтернатива, которая также дает хороший результат:
run_anova2 <- function(var1, var2, df) {
fo <- reformulate(var2, var1)
eval.parent(substitute(aov(fo, df)))
}
run_anova2("Sepal.Width", "Petal.Length", iris)
3) Если вас не волнует, что линия вызова в выводе хороша, тогда можно использовать этот более простой код:
run_anova3 <- function(var1, var2, df) {
fo <- reformulate(var2, var1)
aov(fo, df)
}
run_anova3("Sepal.Width", "Petal.Length", iris)
, давая:
Call:
aov(formula = fo, data = df)
...etc...