Обработка исключений в R - Возврат, когда правильные данные загружены - PullRequest
0 голосов
/ 06 марта 2020

У меня есть следующие поля в наборе данных.

Location : Unique location id of place of installation
Serial : Unique serial number of product
Last Report Date : Date of last communication with location

Рассмотрим только два местоположения, каждое из которых имеет два серийных номера.

Location  Serial LDate       SDate
01        1234   2020-02-29  2020-02-20
01        4321   2020-02-29  2020-02-29
02        2143   2020-03-03  2020-03-03
02        1432   2020-03-03  2020-03-03

Здесь дата последнего отчета о серийных номерах приведена только для справки и фактически не известна. У меня есть набор данных только с одним сериалом из каждого местоположения, как показано ниже:

location serial   SDate
01       1234     2020-02-29
02       1432     2020-03-03

В этом наборе данных SDate является самой последней отчетной датой среди всех сериалов в местоположении.

Данные находится в ведре S3. URL содержит местоположение и дату последнего отчета. Я создаю URL-адрес динамически, чтобы загрузить данные. URL выглядит следующим образом:

url for location 01:"s3://xxxx.xxxx.2020/01/readings/01-20200229.csv"
url for location 02:"s3://xxxx.xxxx.2020/02/readings/02-20200303.csv"

Я написал функцию для загрузки данных для сериалов в мой набор данных. Логика c этой функции выглядит следующим образом:

for(i in 1:nrow(dataset)) {
  date = as.Date(paste0(dataset$SDate[[i]]))
  while (!exists("latest")) {
    latest = s3download(dataset$location[[i]], dataset$serial[[i]], date)
    date = date - 1
  }
  if (!exists("data")) {
    data = latest
    rm(latest)
  }
  else if (exists("data")) {
    data = rbind(data, latest)
    rm(latest)
  }
}

Функция выглядит следующим образом:

s3download = function(location, serial, date) {
  url = paste0(
    "s3://xxxx.xxxx.",
    lubridate::year(date),
    "/",
    location,
    "/readings/",
    location,
    "-",
    gsub("-", "" , as.character(date)),
    ".csv"
  )
  out = tryCatch({
     latestdata = data.frame(aws.s3::s3read_using(read.csv, object = paste(url), header = FALSE))
  }, error = function(cond) {
    message(cond)
    return(NA)
  }, warning = function(cond) {
    message(cond)
    return(NULL)
  },
  finally = {
    message(paste("Dowloaded))
    message("Thank you")
  })
  return(latestdata)
}

Вышеуказанная функция не работает должным образом. Логика c неверна.

Что нужно сделать, это

1 Pick the first location and date from dataset
2 Call the function to dynamically create a url with the date
3 Download the data from S3
  a Download the data for the above date for the location
  b See if the data for the desired serial is available
  c If not, repeat steps and b for next dates for this location till data for serial is met
- Repeat step 1:3 for next record in dataset

Пожалуйста, помогите. Заранее спасибо.

...