for函数内的循环来写多个文件

时间:2014-04-21 01:00:51

标签: r for-loop

我正在尝试编写一个函数,将所有图像放在文件位置并对其应用另一个函数(具体来说,将高斯模糊与不同的sigma应用于每个图像,然后将每个图像写入相同的位置)。 / p>

require(EBImage)
blurpics=function(pics.location){
  x=list.files(pics.location)
  y=length(x)
  for (i in x)  {
    for (j in y)  {
      blurpic=function(x,y){
      pic=readImage(x)
      pic1=gblur(pic,sigma=16.9)
      pic2=gblur(pic,sigma=15.3)
      pic3=gblur(pic,sigma=13.75)
      pic4=gblur(pic,sigma=12.25)
      pic5=gblur(pic,sigma=10.8)
      pic6=gblur(pic,sigma=9.4)
      pic7=gblur(pic,sigma=8.05)
      pic8=gblur(pic,sigma=6.75)
      pic9=gblur(pic,sigma=5.5)
      pic10=gblur(pic,sigma=4.3)
      pic11=gblur(pic,sigma=3.15)
      pic12=gblur(pic,sigma=2.05)
      pic13=gblur(pic,sigma=1)
      writeImage(pic1,paste(y,"_01.jpg",sep=""),quality=70)
      writeImage(pic2,paste(y,"_02.jpg",sep=""),quality=70)
      writeImage(pic3,paste(y,"_03.jpg",sep=""),quality=70)
      writeImage(pic4,paste(y,"_04.jpg",sep=""),quality=70)
      writeImage(pic5,paste(y,"_05.jpg",sep=""),quality=70)
      writeImage(pic6,paste(y,"_06.jpg",sep=""),quality=70)
      writeImage(pic7,paste(y,"_07.jpg",sep=""),quality=70)
      writeImage(pic8,paste(y,"_08.jpg",sep=""),quality=70)
      writeImage(pic9,paste(y,"_09.jpg",sep=""),quality=70)
      writeImage(pic10,paste(y,"_10.jpg",sep=""),quality=70)
      writeImage(pic11,paste(y,"_11.jpg",sep=""),quality=70)
      writeImage(pic12,paste(y,"_12.jpg",sep=""),quality=70)
      writeImage(pic13,paste(y,"_13.jpg",sep=""),quality=70)
      #}    
    }
  }
}

一个问题是该函数仅适用于文件位置中的一个图像.--- 更新:baptiste指出逻辑错误

更重要的是,如何更有效地重写此功能,以便我不必单独定义每个pic变量?

2 个答案:

答案 0 :(得分:1)

就初始问题而言,你可能想要的这类任务是lapply() - 它需要一个列表并将函数应用于每个元素。据推测,您也希望能够将相对高斯模糊水平考虑在内。为此,您需要一个列表,其中每个元素包含两个项目;文件名和模糊程度。所以:

#List files
vector_of_file_names <- list.files(pics.location)

#List gaussian blur levels
gaussian_blur <- c(1,2,3,4)

#And now apply!
lapply(vector_of_file_names, function(x){

    #"x" is the filename
    pic <- readImage(x[[1]])

    for(i in seq_along(gaussian_blur)){

        #Apply gaussian blurring.
        pic = gblur(puc, sigma = gaussian_blur[i])

        #Write out
        writeImage(pic, paste(i, "blurred",x, sep = ""), quality = 70)
     }

})

希望这会有所帮助。通常答案是&#34;我已经嵌套了for循环&#34;将会有一个for循环/应用函数在一个向量列表上运行,而不是一个向量&#34;。

答案 1 :(得分:0)

从OP移动我的解决方案:在baptiste的帮助下,这是我最初寻求的解决方案,并向Ironholds寻求替代解决方案:

blurpic=function(pics.location){
 require(EBImage)
  require(tools)
   x=list.files(pics.location)
   sigma=c(16.9,15.3,13.75,12.25,10.8,9.4,8.05,6.75,5.5,4.3,3.15,2.05,1)
   for (i in seq_along(x))  {
     for(j in seq_along(sigma)) {
      pic=readImage(x[i])
      pic1=gblur(pic,sigma=sigma[j])
      #writeImage(pic1,paste(file_path_sans_ext(x[i]),j,".jpg",sep=""),quality=70)
      writeImage(pic1,paste(i,"_",j,".jpg",sep=""),quality=70)
    }
  }
}

注意:我已根据原始文件名或按顺序命名添加了两个writeImage命名方法。