语句未在函数内执行,独立执行

时间:2013-09-11 02:16:54

标签: r ggplot2

我遇到了一个奇怪的问题(我是R的新手)。我尝试创建一个函数如下:

library(ggplot2)
median_confidence_interval <- function(x) {
  quart_list<-c()
  return_data<-data.frame(lower_ci=0,median=0,upper_ci=0)
  for(i in 1:1000){ 
    y<-x[as.integer(runif(length(x), min = 1, max = length(x) + 1))]
    median<-median(y)
    quart_list=c(quart_list,median)
  }
  return_data$median<-median(quart_list)
  return_data$lower_ci<-quantile(quart_list,probs=0.025)
  return_data$upper_ci<-quantile(quart_list,probs=0.975)
  p <- ggplot()
  p <- p + geom_density(aes(x=x)) + geom_density(aes(x=quart_list)) 
  p <- p + geom_vline(aes(xintercept = return_data$median, color='red'))
  p <- p + geom_vline(aes(xintercept = return_data$lower_ci, color='blue'))
  p <- p + geom_vline(aes(xintercept = return_data$upper_ci, color='green')) + coord_cartesian(xlim = c(min(x),max(x)))
  png("density_confidence_internal.png")
  plot(p)
  dev.off()
  return_data
}

在这段代码中,我只想创建一个情节并保存。虽然我能够在函数外部独立执行这些语句,但不能在函数内部执行。该函数编译时没有错误,但在运行函数时,它没有找到'quart_list'。 如果工作空间中存在quart_listreturn_data,那么我可以执行该函数并获得结果。当我清除工作区并执行该功能时,我在运行(而不是编译)时遇到了同样的错误。

另一个问题是,当我调用函数median_confidence_interval(x)时,它希望我只提供'x'作为参数,它不需要median_confidence_interval(possum$earconch)之类的东西。为什么会这样?

请有人能指出我某个方向吗?

1 个答案:

答案 0 :(得分:0)

ggplot对象的环境评估有点神秘。但是,如果您记得ggplot希望将data.frames传递给data参数,aes中的值应该是data.frame的列,那么通常可以避免问题。

为了调试这样的事情,我发现将print语句插入到函数中以便理清我得到的程度是有帮助的。 (见注释行)

相应地调整您的功能:

median_confidence_interval <- function(x) {
  quart_list<-c()
  return_data<-data.frame(lower_ci=0,median=0,upper_ci=0)
  for(i in 1:1000){ 
    y<-x[as.integer(runif(length(x), min = 1, max = length(x) + 1))]
    median<-median(y)
    # print ('inside for loop')
    quart_list=c(quart_list,median)
  }

  # print('past for loop')
  return_data$median<-median(quart_list)
  return_data$lower_ci<-quantile(quart_list,probs=0.025)
  return_data$upper_ci<-quantile(quart_list,probs=0.975)

  # print('start of ggplot code')
  foo=data.frame(q=quart_list, x=x)
  p <- ggplot()
  p <- p + geom_density(data=foo, aes(x=x)) + geom_density(data=foo, aes(x=q)) 
  # print('past first quart_list reference in ggplot')
  p <- p + geom_vline(data=return_data, aes(xintercept = median, color='red'))
  p <- p + geom_vline(data=return_data, aes(xintercept = lower_ci, color='blue'))
  p <- p + geom_vline(data=return_data, aes(xintercept = upper_ci, color='green')) + coord_cartesian(xlim = c(min(x), max(x)))
  png("/tmp/density_confidence_internal.png")
  plot(p)
  dev.off()
  return_data
}

另外,我认为@DWin在他的评论中有一个很好的观点!