Копировать, повторять или вкладывать в циклы? Код очистить - PullRequest
0 голосов
/ 27 февраля 2020

Я работаю с данными о населении (18 лет = 18 файлов) и пространственными буферами, которые я создал, 6 категорий расстояний = 6 файлов.

Я создал функцию для извлечения данных о населении и создал for loop для функции для работы с 18 файлами и создал отдельную функцию для каждого файла расстояния.

Однако это по-прежнему приводит к большому количеству кода и хотелось бы запустить функцию извлечения совокупности по 18 файлам совокупности и, возможно, repeat или replicate извлечение совокупности для каждого файла расстояния с помощью "cleaner" код.

Моя функция - повторяется 6 раз с изменением в файле "buffer_100km"

extract_100 <-function(filenames) 
{
  dat<-velox(filenames) #load file
  #clip raster prior to extraction
  x_1 <- dat$extract(buffer_100km, fun=function(t) sum(t,na.rm=TRUE)) #extraction from velox pkg
  #need to unlist the extracted values and sum the pop den
  x_2 <- unlist(lapply(x_1,function(x) if (!is.null(x)) sum(x, na.rm=TRUE) else NA))
  #join unlisted values to spatial df
  x_3 <- cbind(buffer_100km, x_2)
  #renaming column
  colnames(x_3)[colnames(x_3)=="x_2"] <- "pop"
  #renaming column
  colnames(x_3)[colnames(x_3)=="ISO3.1"] <- "ISO3"
  #adding a Year column
  x_3<-add_column(x_3, Year = regmatches(filenames, regexpr("[0-9].*[0-9]",filenames)), .after = "NAME_0") #add_column function from tibble package
  #adding a Distance column
  x_3<-add_column(x_3, Distance = "100km", .after = "Year")
  #drop geometry to allow for saving in .CSV
  x_4 <-st_drop_geometry(x_3)
  ##saving data as .gpkg 
  st_write(x_3, dsn = paste0("./Output_pop/Pop_ls",regmatches(filenames, regexpr("[0-9].*[0-9]",filenames)),"_100.gpkg"), delete_dsn =TRUE)
  #saving population values into .csv for checking 
  write.csv(x_4, file = paste0("./Output_pop/Pop_ls",regmatches(filenames, regexpr("[0-9].*[0-9]",filenames)),"_100.csv"))
}

Моя для l oop

for (f in filenames){
  print(f)
  tic("Population Extraction - 100km") #start timing of extraction function
  extract_100(f)
  toc(log = TRUE, quiet = TRUE)#closing timing and logging times
}

Мне нужна помощь в написании чище код для этой работы. Я в замешательстве, если мне нужно repeat, replicate или nested for loop?

...