提问者:小点点

R中的函数,传入变量


我希望在R中运行多个ANOVAs,所以我希望编写一个函数。

df = iris

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

在iris数据集中,列名为“Sepal.Length”“Sepal.Width”“Petal.Length”“Petal.Width”“Species”

假设我想在方程中使用这些列,我如何将它们传递到run_anova函数中?我试着把它们作为字符串传递进来

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

这不起作用,因为出现此错误:在storage.mode(v)

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

当我把它们传递给没有引号的人时,“找不到”。如何将df列的这些名称传递给函数?

非常感谢你的帮助。


共2个答案

匿名用户

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)虽然不鼓励使用ava,但另一种也能提供良好输出的方法是:

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...

匿名用户

另一种方法是使用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)))
}

这允许您对var1var2使用字符串和无引号表达式:

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

两个表达式返回相同的结果。