Передача списка одной функции в другую в разных каталогах - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь назначить случайные числа для копии файла в различных каталогах (сложно скопировать).Структура каталогов следующая:

1100    
1100/Images

Сначала я создаю новые каталоги и копирую изображения по ним.Для этого у меня есть следующий рабочий

NewImageGen <- function(singledir){
  #
  Directoryforrandoms <- "RandomNumAsignment"
  Directoryforrandoms <- paste(singledir, "/", Directoryforrandoms, sep = "")
  dir.create(Directoryforrandoms,
             showWarnings = F)
  #
  Imagedir <- paste(singledir, '/Images', sep = '')
  filestocopy <- list.files(Imagedir,
                            recursive = F,
                            full.names = T)
  file.copy(from = filestocopy,
            to = Directoryforrandoms,
            overwrite = F)
  #
  newfiles <- list.files(path = Directoryforrandoms,
                         pattern = ".tif", # they are all tiff files
                         full.names = T)
  #
  return(newfiles)
}
NewImages <- pblapply(alldirs, FUN = NewImageGen)

. Это дает мне большой список, который разделен на четыре (из-за наличия четырех каталогов в данном случае).Я хочу передать newfiles другой функции, которая генерирует префикс случайного числа и прикрепляет его к передней части.Я могу сделать это в обычном списке файлов, используя:

RandomNumGen <- function(singleimg){
  randomnumber <- as.character(sample(100000:999999, 1, replace=F))
  singlerename <- sub('^', randomnumber, singleimg)
  file.rename(from = singleimg,
              to = singlerename)
}

Он проходит через все элементы списка, но возвращает разочаровывающий false.

Любая помощь будет на высшем уровне!

1 Ответ

0 голосов
/ 10 апреля 2019

pblapply() возвращает list, а list.files() возвращает символьный вектор. Поэтому, если ваша функция работает с возвращаемым значением list.files(), попробуйте изменить ваш вызов с pblapply() на pbsapply().

Edit:

newfiles, то есть возвращаемое значение функции NewImageGen() содержит полные пути (как вы установили full.names = T в последнем вызове list.files()).

sub('^', randomnumber, singleimg) добавит случайное число перед первой частью пути, например 677570/home/Jim/1100/Images/RandomNumAsignment/original_image_name.tif.

Вместо этого вы хотите сделать

file.path(dirname(singleimg), sub('^', randomnumber, basename(singleimg))
...