R reactiveFileReader считывает данные из корзины aws s3

#r #amazon-s3 #shiny

#r #amazon-s3 #блестящий

Вопрос:

Я могу прочитать CSV из моей корзины S3, используя приведенный ниже код

 aws.s3::s3read_using(read.csv,
                     stringsAsFactors=FALSE,
                     check.names=FALSE,
                     object=paste0(Sys.getenv("BUCKET_PREFIX"), "/a.csv"),
                     bucket = Sys.getenv("AWS_BUCKET_NAME"),
                     opts=bucket_opts
    )
  

Я хочу изменить это на использование функции reactiveFileReader. Я безуспешно пробовал нижеприведенное, есть идеи, что я делаю не так?

 reactiveFileReader(
      intervalMillis = 10000,
      session= session,
      filePath = paste0(Sys.getenv("BUCKET_PREFIX"), "/a.csv"),
      readFunc = aws.s3::s3read_using,
      FUN = read.csv,
      stringsAsFactors=FALSE,
      check.names=FALSE,
      object=paste0(Sys.getenv("BUCKET_PREFIX"), "/a.csv"),
      bucket = Sys.getenv("AWS_BUCKET_NAME"),
      opts=bucket_opts
      )

  

Ответ №1:

У меня была такая же проблема, и я решил ее с помощью небольшого обходного пути:

в глобальном масштабе.R вы считываете свои данные при запуске приложения shiny.

 data_obj <- aws.s3::s3read_using(read.csv,
                     stringsAsFactors=FALSE,
                     check.names=FALSE,
                     object=paste0(Sys.getenv("BUCKET_PREFIX"), "/a.csv"),
                     bucket = Sys.getenv("AWS_BUCKET_NAME"),
                     opts=bucket_opts
    )

#bucket information
content_bucket <- aws.s3::get_bucket(bucket = Sys.getenv("AWS_BUCKET_NAME"))

  

на сервере.R вы устанавливаете таймер, чтобы проверить, изменились ли данные на S3.

   shiny::observe({

shiny::invalidateLater(3600e3) #timer for every hour to check the following

#temporary bucket information
bucket_content_check <- aws.s3::get_bucket(bucket = Sys.getenv("AWS_BUCKET_NAME"))

#reload data if timestamp differs
    if (bucket_content$Contents$LastModified != bucket_content_check$Contents$LastModified) {
      
data_obj <<- aws.s3::s3read_using(read.csv,
                     stringsAsFactors=FALSE,
                     check.names=FALSE,
                     object=paste0(Sys.getenv("BUCKET_PREFIX"), "/a.csv"),
                     bucket = Sys.getenv("AWS_BUCKET_NAME"),
                     opts=bucket_opts
    )

#overwrite global bucket_content for next check
content_bucket <<- aws.s3::get_bucket(bucket = Sys.getenv("AWS_BUCKET_NAME"))

message('S3 data reloaded')
      }

    message('S3 bucket checked')
})