Сортировка списка в подсписки на основе сопоставления с образцом R - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть несколько файлов TIFF (каждый из которых принадлежит дате изображения) в одной папке, и я хочу создать списки на столько уникальных дат, сколько есть, а затем заполнить эти списки соответствующими файлами. В идеале мне бы хотелось иметь функцию, в которой пользователь просто вносил бы изменения в список дат, хотя я не смог запустить функцию, которая бы перебирала мой список дат. Вместо этого я попытался создать функцию и запускал ее для каждой уникальной даты.

dates <- list('20180420', '20180522', '20180623', '20180725', '20180810')

# Make a list of all files in the data directory
allFilesDataDirectory <- list.files(path = dataDirectory, pattern = 'TIF$')
# allFilesDataDirectory is a list of 60 TIFF files with the same naming convention along the lines of LC08_L1TP_038037_20180810_20180815_01_T1_B9

allDateLists <- NULL
for (d in dates){
  fileFolderDate <- NULL
  dynamicDateNames <- paste0('fileListL8', d)
  assign(dynamicDateNames, fileFolderDate) 
  allDateLists <- c(allDateLists, dynamicDateNames)
}

myFunction <- function(date, fileNameList){
# files first
  for (i in allFilesDataDirectory){
    # Create a list out of the file name by splitting up the name wherever there is a _ in the name
    splitFileName <- unlist(strsplit(i, "[_]"))
    if(grepl(splitFileName[4], date) & (grepl('B', splitFileName[8]))){
      fileNameList <- c(fileNameList, i)
      print(i)
    } 
    else {
      print('no')
    }
  }
}

myFunction(date = '20180623', fileNameList = 'fileListL820180623')

Функция выполняется, но fileListL820180623 имеет значение NULL.

При жестком кодировании все работает и я не уверен в разнице. Я попытался использовать метод assign () (здесь не показан), но он ничего не сделал.

for (i in allFilesDataDirectory){
  # Create a list out of the file name by splitting up the name wherever there is a _ in the name
  splitFileName <- unlist(strsplit(i, "[_]"))
  if(grepl(splitFileName[4], '20180623') & (grepl('B', splitFileName[8]))){
    fileListL820180623 <<- c(fileListL820180623, i)
  } 
  else {
    print('no')
  }
}

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Я не совсем уверен, чего вы хотите добиться, но кажется, что вы делаете это слишком сложно, и вы используете неправильные варианты с ярлыками <<- и assign (очень мало случаев, когда их использование оправдано) ,

Я бы предложил что-то вроде этого:

getTiffPattern <- function(pattern='', folder='.') {
    ff <- list.files(folder, pattern = pattern, full=TRUE)
    grep('\\.tif$', ff, ignore.case = TRUE, value=TRUE)
}

getTiffPattern('20180420')

или для вектора дат

dates <- list('20180420', '20180522', '20180623', '20180725', '20180810')  
x <- lapply(dates, getTiffPattern)
0 голосов
/ 06 сентября 2018

По какой-то причине grepl не работал в этом случае, но glob2rx работал отлично.

dates <- list('20180420', '20180522', '20180623', '20180725', '20180810')

for (d in dates){
  listLandsatFiles <- list.files(path = dataDirectory, pattern = glob2rx(paste0('*', d, '*B*TIF')))
files
  dynamicFileListName <- paste0('fileListL8', d)
  assign(dynamicFileListName, listLandsatFiles)
}

p.s. Это может быть полезно, если у вас есть несколько изображений Landsat, сохраненных в одном каталоге, и вы хотите создавать списки по дате изображения только для файлов TIFF (и, возможно, позже захотите сделать растровый блок).

...