Использование функции в списке файлов .tif для сортировки по размеру (на основе пикселей) - PullRequest
0 голосов
/ 28 января 2019

Как говорится в вопросе, я пытаюсь отсортировать 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 голосов
/ 28 января 2019

Две ключевые вещи:

Во-первых, list.files уже выводит итеративную структуру данных, поэтому нет необходимости заключать ее в as.list().

Два, ваша конструкция lapply не совсем верно.lapply передает первый аргумент второму FUN аргументу.Указывая bigsmallsorter(singleimage = imagelist), вы пытаетесь передать свой список файлов своей функции, которая принимает один аргумент, который напрямую конфликтует с тем, как работает lapply.

Вместо этого мы разрешаем lapply передавать каждый элемент списка в bigsmallsorter, например:

lapply(imagelist, FUN = bigsmallsorter)

Вы можете эквивалентно написать:

lapply(imagelist, bigsmallsorter)

A немногоБолее подробный способ написать это:

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

Где x представляет переменную, через которую передается imagelist, по одному за раз.

...