正如问题所指出的,我正在尝试根据像素的高度和宽度对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"
任何帮助将不胜感激,因为手动对图像进行排序完全是一种痛苦!
非常感谢
答案 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
一次通过的变量。