使用ggplot2在函数内绘制data.frame

时间:2014-02-10 19:53:44

标签: r ggplot2 subset

我有这个函数来获取IRT包sirt返回的对象和用户可以指定的一组项目的绘图项响应函数:

plotRaschIRF <- function(x,items=NULL,thl=-5,thu=5,thi=.01,D=1.7) {
  if (!class(x)=="rasch.mml") stop("Object must be of class rasch.mml")
  thetas <- seq(thl,thu,thi)
  N <- length(thetas)
  n <- length(x$item$b)
  tmp <- data.frame(item=rep(1:n,each=N),theta=rep(thetas,times=n),b=rep(x$item$b,each=N))
  probs <- exp(D*(tmp[,2]-tmp[,3]))/(1+exp(D*(tmp[,2]-tmp[,3])))
  dat <- data.frame(item=rep(1:n,each=N),theta=rep(thetas,times=n),b=rep(x$item$b,each=N),p=probs)
  #dat$item <- factor(dat$item,levels=1:n,labels=paste0("Item",1:n))
  if (is.null(items)) {
    m <- min(10,n)
    items <- 1:m
    if (10<n) warning("By default, this function will plot only the first 10 items")
  }
  if (length(items)==1) {
    title="Item Response Function"
  } else {
    title="Item Response Functions"
  }
  dat2 <- subset(dat,eval(quote(eval(item,dat) %in% items)))
  dat2$item <- factor(dat2$item,levels=unique(dat2$item),labels=paste0("Item",unique(dat2$item)))
  out <- ggplot(dat2,aes(x=theta,y=p,group=item)) +
   geom_line(aes(color=dat2$item),lwd=1) + guides(col=guide_legend(title="Items")) +
   theme_bw() + ggtitle(title) + xlab(expression(theta)) +
   ylab("Probability") + scale_x_continuous(breaks=seq(thl,thu,1))
  print(out)
}

但是在我开始使用ggplot2(我将一列dat2转换为一个因子)或ggplotting本身之前,它似乎陷入了任何一条线 - 不确定哪个。我收到错误消息"Error in eval(expr, envir, enclos) : object 'dat2' not found".

我按照建议this尝试阅读here,但要么这是另一个问题,要么就是我没有得到它。当我逐行逐行时,该功能正常工作。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

根据您的评论,错误几乎肯定在geom_line(aes(color=dat2$item))。摆脱dat2$它应该可以正常工作(即geom_line(aes(color=item)))。 aes中的资料在data参数(此处为dat2)中进行评估,并将全局环境作为附件。值得注意的是,这意味着aes无法使用函数环境中的内容,除非它是datadat2此处)的一部分。由于dat2中不存在dat2,并且全局环境中不存在dat2,因此您会收到该错误。