Loop не работает при создании функции в R

У меня есть очень простой вопрос о том, как создать функцию и зацитировать ее в 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
    }

Теперь я хотел бы сделать мою процедуру функцией, чтобы я мог применить ее на нескольких Dataframes без повторения моего кода. Я подумал:

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

Поэтому, в конце концов, эта функция работает, но она больше не зацикливается. В качестве вывода создается только первый столбец моей файловой системы. Что я делаю не так?

1
добавлено отредактировано
Просмотры: 2
nl ja de
Вы имеете в виду длину (x) в обоих примерах? Разве это не будет length (df.abcd) в первом, а length (y) во втором?
добавлено автор user295691, источник
@ user295691 да, вы правы. Я отредактировал его. Спасибо
добавлено автор Joschi, источник
@ user295691 да, вы правы. Я отредактировал его. Спасибо
добавлено автор Joschi, источник

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)
2
добавлено
+1 для указания ошибок
добавлено автор Joris Meys, источник
хорошо, это сработало. Спасибо за вашу помощь :) !
добавлено автор Joschi, источник

у вас есть некоторые ошибки в коде. (измените 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)
2
добавлено
+1 для указания ошибок
добавлено автор Joris Meys, источник
хорошо, это сработало. Спасибо за вашу помощь :) !
добавлено автор Joschi, источник

Рядом с ошибками, указанными 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()
    }
}

И на самом деле, я бы использовал pdf или png вместо tiff. Это просто пустая трата дискового пространства.

2
добавлено
+ для функции tiff!
добавлено автор agstudy, источник