3

私は奇妙な問題に遭遇しました(私は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_listとがワークスペースに存在する場合return_data、関数を実行して結果を取得できます。ワークスペースをクリアして関数を実行すると、実行中 (コンパイル中ではない) に同じエラーが発生します。

もう 1 つの問題は、関数 を呼び出すときにmedian_confidence_interval(x)、引数として 'x' のみを指定することを期待しており、median_confidence_interval(possum$earconch). それはなぜでしょうか?

誰かが私をある方向に向けることができますか?

4

1 に答える 1

0

オブジェクトの環境評価はggplot少し不思議です。ただし、 を引数に渡す必要があり、その値をの列にする必要があることを覚えていれば、ggplot通常は問題を回避できます。data.framesdataaesdata.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 のコメントには良い点があると思います。

于 2013-09-11T02:28:47.750 に答える