3

我制作了这个函数,旨在输出 ANCOVA 的摘要并绘制结果:

statAncova <- function (dataframe, response, covariate, Factor) {

  library(ggplot2)
  mod <- aov(response ~ covariate + Factor, data=dataframe)
  pred <- predict(mod)
  plotMod <- ggplot(data = cbind(mod$model, pred), aes(covariate, response, color=Factor)) + 
    geom_point() +
    facet_grid(. ~ Factor) + 
    geom_line(aes(y=pred))

  return(list(mod, plotMod))

}

如果我尝试使用这样的功能:

statAncova(mtcars, drat, hp, cyl)

我收到此错误:

Error in eval(expr, envir, enclos) : object 'drat' not found

我究竟做错了什么?

4

1 回答 1

3

R 期望在环境中有一个名为“drat”的对象,但“drat”是数据框 mtcars 的成员。

我知道可能有一个更优雅的解决方案,但解决它的一种方法是使用:

statAncova <- function (dataframe, response, covariate, Factor) {

  library(ggplot2)
  eval(parse(text=paste0("mod <- aov(",response," ~ ",covariate," + ",Factor,", data=dataframe)")))
  pred <- predict(mod)
  eval(parse(text=paste0("plotMod <- ggplot(data = cbind(mod$model, pred), aes(",covariate,", ",response,", color=",Factor,")) + 
  geom_point() +
  facet_grid(. ~ ",Factor,") + 
  geom_line(aes(y=pred))")))

  return(list(mod, plotMod))

}

statAncova(mtcars, "drat", "hp", "cyl")

或者,您可以只传递您感兴趣的单个变量:

statAncova <- function (response, covariate, Factor) {

  dataframe <- data.frame(response, covariate, Factor)

  library(ggplot2)
  mod <- aov(response ~ covariate + Factor, data=dataframe)
  pred <- predict(mod)
  plotMod <- ggplot(data = cbind(mod$model, pred), aes(covariate, response, color=Factor)) + 
    geom_point() +
    facet_grid(. ~ Factor) + 
    geom_line(aes(y=pred))

  return(list(mod, plotMod))

}

statAncova(mtcars$drat, mtcars$hp, mtcars$cyl)
于 2013-06-25T14:30:07.703 回答