在调用ezANOVA的自定义R函数中:如何参数化dv?

时间:2015-09-16 19:01:01

标签: r

我试图在我希望允许使用参数指定dv的函数中使用ez包中的ezANOVA。通常,ezANOVA会将列变量作为符号或字符串接受(参见"本作品"下面)。但是,尝试给ezANOVA一个包含符号或字符的参数不起作用(参见"这不起作用"下面)。 ezANOVA抱怨'" the_dv"不是所提供的数据框中的变量'。我尝试用各种方法包装变量名,比如as.symbol(),as.formula(),甚至尝试了各种方法来合并eval()和substitute(),但都没有运气。这是如何实现的?

如果它的原因有帮助,我有一个项目,我需要进行许多化合物分析(手段,anovas,post-hocs,图表),这些分析对于数据集或被分析的变量是相同的。我想要一个函数,所以我可以编写一次并运行它多次。下面的代码只是一个简单的例子。

library(ez)

df<-data.frame(ID=as.factor(101:120), 
               Training=rep(c("Jedi", "Sith"), 10), 
               Wins=sample(1:50, 20), 
               Losses=sample(1:50, 20))

# ----------
# This Works
# ----------

myfunc1 <- function(the_data) {
  ezANOVA(
    data = the_data,
    wid = ID,
    dv = Wins,
    between = Training
  )
}

myfunc1(the_data = df)

# ------------------
# This Does Not Work
# -------------------

myfunc2 <- function(the_data, the_dv) {
  ezANOVA(
    data = the_data,
    wid = ID,
    dv = the_dv,
    between = Training
  )
}

myfunc2(the_data = df, the_dv = Wins)  # 'Wins' also fails

1 个答案:

答案 0 :(得分:4)

不得不自己解决这个问题。事实证明,eval()和substitute()的组合解决了这个难题:

# ----------------------------------
# Aha, it works!
# ----------------------------------

library(ez)

df<-data.frame(ID=as.factor(101:120), 
               Training=rep(c("Jedi", "Sith"), 10), 
               Wins=sample(1:50, 20), 
               Losses=sample(1:50, 20))

myfunc2 <- function(the_data, the_dv) {
  eval(
    substitute(
      ezANOVA(data = the_data, 
              wid = ID, 
              dv = the_dv, 
              between = Training), 
      list(the_dv = the_dv)))
}

myfunc2(the_data = df, the_dv = 'Wins')
myfunc2(the_data = df, the_dv = 'Losses')

享受!!