使用.tif文件列表中的函数按大小(基于像素)排序

时间:2019-01-28 17:22:25

标签: r function lapply

正如问题所指出的,我正在尝试根据像素的高度和宽度对1000个tif文件进行排序(出于生态目的,对于任何感兴趣的人!)

我编写了一个函数,该函数使用magick包来创建简单的图像尺寸,该图像尺寸由imageinfo$width*imageinfo$height实现,请参见下文。将该阈值与决定其大小的阈值进行比较。该函数正常工作,但是我在列表上运行lapply时很挣扎,它使用image_read中的magick函数给出了错误消息。

threshold <- 90000
dirsmallimages <- "C:/Users/James PC/Desktop/smallimages"
dirbigimages<- "C:/Users/James PC/Desktop/bigimages"

imagelist <- as.list(list.files(
  path = "C:/Users/James PC/Desktop",
  full.names = TRUE,
  recursive = FALSE,
  pattern = ".tif"
))

bigsmallsorter <- function(singleimage){
  imagepreview <- image_read(singleimage)
  imagepreview
  imageinfo <- image_info(imagepreview)
  imagesize <- as.numeric(imageinfo$width*imageinfo$height)

  if(imagesize > threshold){
    file.copy(from = singleimage, to = dirbigimages, overwrite = TRUE)
  } else {
    file.copy(from = singleimage, to = dirsmallimages, overwrite = TRUE)
  }
}

lapply(imagelist, FUN = bigsmallsorter(singleimage = imagelist)) # this is kaput

错误:

 Error in image_read(singleimage) : 
  path must be URL, filename or raw vector 

我目前正试图在一个大[[1]]和小[[2]]的列表上工作:

> imagelist
[[1]]
[1] "C:/Users/James PC/Desktop/Pia1.2017-10-03.1726+N00007823_hc.tif"
[[2]]
[1] "C:/Users/James PC/Desktop/Pia1.2017-10-08.1928+N00691602_hc.tif"

任何帮助将不胜感激,因为手动对图像进行排序完全是一种痛苦!

非常感谢

1 个答案:

答案 0 :(得分:1)

两个关键事项:

一个,list.files已经输出了一个可迭代的数据结构,因此无需将其包装在as.list()中。

二,您对lapply的构造不太正确。 lapply将第一个参数传递给第二个FUN参数。通过指定bigsmallsorter(singleimage = imagelist),您试图将文件列表传递给带有单个参数的函数,该参数与lapply的工作方式直接冲突。

相反,我们让lapply将每个列表项传递给bigsmallsorter,如下所示:

lapply(imagelist, FUN = bigsmallsorter)

您可以等效地写:

lapply(imagelist, bigsmallsorter)

一种更详细的写法是:

lapply(imagelist, FUN = function(x) bigsmallsorter(singleimage = x))

x代表变量imagelist一次通过的变量。