首页 > 解决方案 > 从 RStudio 将多个文件上传到 Google Cloud

问题描述

我正在使用 R 和 R markdown 的组合生成多个 html 文件。使用 for 循环和 put object 命令可以轻松将多个单独标识的文件上传到 AWS s3。这是一个例子:

for (i in 1:nrow(Data)){
  rmarkdown::render(input = "report.Rmd",
                    output_format = "html_document",
                    output_file = paste("output/report_", i, ".html", sep =''))}
library(aws.s3)
Sys.setenv(AWS_ACCESS_KEY_ID = "XXXX",
           AWS_SECRET_ACCESS_KEY = "YYYYY",
           AWS_DEFAULT_REGION = "ZZZZ")

# put_object to upload to AWS
for (i in 1:nrow(Data)){
  put_object(file = paste("/Users/me/output/report_", i, ".html", sep = ''),
             object = paste("report_", i, ".html", sep = ''), bucket = "mybucket")}

我试图了解如何对 Google Cloud Storage 做同样的事情。

library(googleCloudStorageR)
library(googleAuthR)


Sys.setenv("GCS_DEFAULT_BUCKET" = "reports",
           "GCS_AUTH_FILE" = "file/path/to.json")

我可以毫无问题地上传单个输出:

gcs_upload(file = "output/report_1.html", bucket = "reports")

当我尝试使用循环上传多个单独命名的文件时,它会失败。

for (i in 1:nrow(Data)){
  gcs_upload(file = paste("output/report_", i, ".html", sep = ""), bucket = "reports")
}

此代码将编写第一个 html 输出,偶尔会编写第二个输出,但绝不会是完整集。

所有帮助表示赞赏。

更新:我已经放弃了这项工作。一种解决方法是使用 for 循环上传到 AMZN,并使用 GCS 命令安排重复传输到 GCS。其他解决方法使用 CLI,但我不想那样做。我怀疑对该线程缺乏响应表明几乎不需要创建从 R 到 GCS 的上传。另外,请向编写 Raws s3 包的人大喊大叫。工作精美!

标签: ramazon-web-servicesgoogle-cloud-platform

解决方案


我认为这可能是由于没有name在循环中使用参数,默认情况下该参数派生自 R 对象的名称,因此在循环时会导致错误。

这可能会奏效:

for (i in 1:nrow(Data)){
  the_file_name <- paste("output/report_", i, ".html", sep = "")
  gcs_upload(the_file_name, name = the_file_name, bucket = "reports")
}

推荐阅读