Функция в R, передавая переменные - PullRequest
0 голосов
/ 24 февраля 2020

Я хочу запустить несколько ANOVA в R, поэтому я надеялся написать функцию.

df = iris

run_anova <- function(var1,var2,df) {
  fit = aov(var1 ~ var1 , df)
  return(fit)
}

В наборе данных iris имена столбцов: "Sepal.Length", "Sepal.Width" "Petal.Length" "Petal.Width" "Виды"

Предполагая, что я хочу использовать эти столбцы в уравнениях, как мне передать их в функцию run_anova? Я попытался передать их как строки

run_anova("Sepal.Width", "Petal.Length", df)

, которые не работают, потому что появляется эта ошибка: "В storage.mode (v) <-" double ":" </p>

run_anova(Sepal.Width, Petal.Length, df)

Когда я просто передаю их без кавычек, «не найдено». Как я могу передать эти имена столбцов df в функцию?

Большое спасибо заранее за вашу помощь.

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

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...
0 голосов
/ 24 февраля 2020

Альтернативой является использование синтаксиса квази-кавычки rlang

df = iris

library(rlang)
run_anova <- function(var1, var2, df) {
    var1 <- parse_expr(quo_name(enquo(var1)))
    var2 <- parse_expr(quo_name(enquo(var2)))
    eval_tidy(expr(aov(!!var1 ~ !!var2, data = df)))
}

Это позволяет вам использовать как строки, так и выражения без кавычек для var1 и var2:

run_anova("Sepal.Width", "Petal.Length", df)
run_anova(Sepal.Width, Petal.Length, df)

Оба выражения возвращают одинаковый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...