2

関数を作成して R でループする方法について非常に基本的な質問があります。

    #create a test df
    a<-c(1,2,3,4,5,6,7)
    b<-c(1,2,4,4,5,6,7)
    c<-c(1,7,1,7,2,5,4)
    d<-c(1,7,1,7,2,5,4)
    df.abcd<-data.frame(a,b,c,d)

Boxplots を自動的に作成し、その出力を保存したいと考えています。次のようにうまく動作します:

    # Create Boxplots from all columns
    for (x in 1:length(df.abcd)) {
      windows()#opens a graphics window - necesarry for the plots
      boxplot(df.abcd[,x], 
      main=names(df.abcd)[x])#writes colnames as title
      savePlot(filename=paste("E:\\R\\2_outputs\\boxplot_,deparse(x)), type="tiff")
      dev.off()#disables the graphics window
    }

コードを繰り返さずに複数のデータフレームに適用できるように、プロシージャを関数にしたいと思います。私は次のようなことを考えました:

    #make the above a function and apply it
    test.function<-function(y){
      for (x in 1:length(y)){
      windows()
      boxplot(y[,x], 
      main=names(y)[x])
      savePlot(filename=paste("E:\\R\\2_outputs\\boxplot_,deparse(x)), type="tiff")
      dev.off()
    }}
    test.function(df.abcd)

したがって、最終的にこの関数は機能しますが、ループしなくなります。データフレームの最初の列のみが出力として作成されます。私は何を間違っていますか?

4

2 に答える 2

3

コードにいくつかの間違いがあります。(x を y に変更し、パス名に " を追加します。) これは機能するはずです。

test.function<-function(y){
  for (x in 1:length(y)){
    windows()
    boxplot(y[,x],   main=names(y)[x])
    savePlot(filename=paste("E:\\R\\2_outputs\\boxplot_",deparse(x)), type="tiff")
      dev.off()
    }
}

このようなことをする方が良いです(@ Jorisの回答と同じです。ここで直接tiffを使用する方が良いかもしれません)

test.function<-function(y){
  for (x in 1:length(y)){
    png(paste("E:\\R\\2_outputs\\boxplot_",deparse(x),'.tiff'))
    pp <- boxplot(y[,x],   main=names(y)[x])
    dev.off()
    }
}

test.function(df.abcd)
于 2013-01-09T13:59:21.970 に答える
2

agstudy が指摘した間違いに加えて、そのプロットを保存するためのはるかに優れた方法があります (「参考文献」を参照?tiff)。

test.function<-function(y){
  for (x in seq_along(y)){
    tiff(filename = paste("E:\\R\\2_outputs\\boxplot_",deparse(x))
    boxplot(y[,x],   main=names(y)[x])
    dev.off()
    }
}

実際には、tiff の代わりにpdforを使用します。pngそれはディスク容量の無駄です。

于 2013-01-09T14:01:54.877 に答える