Как загрузить и сохранить несколько файлов с Google диска в определенную папку на моем ноутбуке с помощью пакета R и googledrive

#r #purrr

Вопрос:

Я следую инструкциям в этом посте, чтобы загрузить 2 csv-файла с моего Google диска на свой компьютер. Вот приведенный код —

 library(googledrive)
library(purrr)

## store the URL you have
folder_url <- "https://drive.google.com/drive/folders/0B7tJg2i5HAo2c0VzVFVhLUdQcnM"

## identify this folder on Drive
## let googledrive know this is a file ID or URL, as opposed to file name
folder <- drive_get(as_id(folder_url))

## identify the csv files in that folder
csv_files <- drive_ls(folder, type = "csv")

## download them
walk(csv_files$id, ~ drive_download(as_id(.x)))
 

Приведенные выше инструкции загружают csv-файлы в мою папку «документы». Я пытаюсь загрузить файлы в определенную папку на своем ноутбуке, используя небольшое изменение последнего бита кода

 walk(csv_files$id, ~ drive_download(as_id(.x),
                                    path = "../Desktop/data_folder/,
                                    overwrite = TRUE))
 

К сожалению, при этом сохраняется один файл .xlsx, который не содержит никаких данных и не может быть открыт. Как исправить код для сохранения обоих файлов в определенной папке?

Ответ №1:

Проблема в том, что path параметру требуется полное имя файла, а не просто путь к каталогу. Поэтому по умолчанию он определяет имя файла с помощью методов goodledrive и использует его для создания файла на вашем компьютере в текущем рабочем каталоге. Но если вы не хотите такого поведения по умолчанию, вам также следует указать имя файла. Таким образом, по сути, есть два варианта:

  1. Установите свой рабочий каталог в папку, в которую вы хотите загрузить файлы, прежде чем запускать предоставленный вами код. (и тогда, скорее всего, будет хорошей идеей изменить его обратно)
  2. Перепишите сценарий так, чтобы этот path параметр создавался с использованием имени файла googledrive. Что-то вроде этого:
 path <- "~/Documents/tmp/data_folder/"
for (i in seq_along(csv_files$name)) {
  drive_download(
    as_id(csv_files$id[[i]]),
    path = file.path(path, csv_files$name[[i]]),
    overwrite = TRUE
  )
}
 

Или, если вы предпочитаете использовать walk :

 csv_files %>% 
  split(csv_files$id) %>% 
  walk(~drive_download(.$id, path = file.path(path, .$name), overwrite = TRUE))