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)

我想自动创建箱线图并保存它们的输出。它像这样工作正常:

    # 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()
    }
}

实际上,我会使用pdforpng而不是 tiff。这只是浪费磁盘空间。

于 2013-01-09T14:01:54.877 回答