#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')
})