Обзор
googledrive позволяет взаимодействовать с файлами на Google Диске из R.
Установка
Установить из CRAN:
install.packages("googledrive")
Использование
Загрузить googledrive
library("googledrive")
Соглашения о пакете
- Большинство функций начинаются с префикса
drive_
. Автозаполнение – ваш друг. - Цель состоит , чтобы обеспечить доступ Drive , который чувствует себя похож на утилиты Unix файловых систем, например,
find
,ls
,mv
,cp
,mkdir
, иrm
. - Метаданные для одного или нескольких файлов
dribble
на Диске хранятся в тиббле «Диск». Это фрейм данных с одной строкой на файл. Дриблинг возвращается (и принимается) почти каждой функцией в googledrive. Цели дизайна:- Дайте людям то, что они хотят: имя файла
- Отслеживайте, что хочет API: идентификатор файла
- Сохраняйте все остальные метаданные, отправленные обратно API
- googledrive поддерживает конвейерную обработку и, по сути, реэкспортирует
%>%
, но не требует его использования.
Быстрая демонстрация
Вот как вывести список n_max
файлов, которые вы видите на « Моем диске» . Здесь вы можете ожидать, что вас отправят в ваш браузер для аутентификации и авторизации пакета googledrive для работы от вашего имени с Google Диском.
drive_find(n_max = 30)
#> # A dribble: 30 × 3
#> name id drive_resource
#> <chr> <drv_id> <list>
#> 1 2021-09-16_r_logo.jpg 1dandXB0QZpjeGQq_56wTXKNwaqgsOa9D <named list [41…
#> 2 2021-09-16_r_about.html 1XfCI_orH4oNUZh06C4w6vXtno-BT_zmZ <named list [40…
#> 3 2021-09-16_imdb_latin1.csv 163YPvqYmGuqQiEwEFLg2s1URq4EnpkBw <named list [39…
#> 4 2021-09-16_chicken.txt 1axJz8GSmecSnaYBx0Sb3Gb-SXVaTzKw7 <named list [40…
#> 5 2021-09-16_chicken.pdf 14Hd6_VQAeEgcwBBJamc-FUlnXhp117T2 <named list [40…
#> 6 2021-09-16_chicken.jpg 1aslW1T-B8UKzAEotDWpmRFaMyMux5-it <named list [41…
#> 7 2021-09-16_chicken.csv 1Mj--zJYZJSMKsNVjk2tYFef5LnCsNoDT <named list [39…
#> 8 pqr 143iq-CswFTwJTjVfKkcFMDW0jYqDeUj2 <named list [34…
#> 9 mno 1gcUTnFbsF6uioJrLCsVQ78_F1wEzyNtI <named list [33…
#> 10 jkl 17T40phn99w0hY-B_Ev0deTvVg9fmUSnt <named list [33…
#> # … with 20 more rows
Вы можете сузить запрос, указав имя, по которому pattern
вы хотите сопоставить имена. Или указав тип файла: type
аргумент понимает типы MIME, расширения файлов и несколько понятных человеку ключевых слов.
drive_find(pattern = "chicken")
drive_find(type = "spreadsheet") ## Google Sheets!
drive_find(type = "csv") ## MIME type = "text/csv"
drive_find(type = "application/pdf") ## MIME type = "application/pdf"
Кроме того, вы можете уточнить поиск с помощью q
параметра запроса. Принятые условия поиска можно найти в документации Google Drive API . Например, чтобы увидеть все файлы, которые вы отметили звездочкой и которые могут читать «все, у кого есть ссылка», сделайте следующее:
(files <- drive_find(q = c("starred = true", "visibility = 'anyoneWithLink'")))
#> # A dribble: 2 × 3
#> name id drive_resource
#> <chr> <drv_id> <list>
#> 1 r_logo.jpg 1wFAZdmBiSRu4GShsqurxD7wIDSCZvPud <named list [41]>
#> 2 THANKS 19URV7BT0_E1KhYdfDODszK5aiELOwTSz <named list [40]>
Обычно вы хотите сохранить результат вызова googledrive, как мы это делаем files
выше. files
представляет собой каплю с информацией о нескольких файлах и может использоваться в качестве входных данных для нисходящих вызовов. В любой момент им также можно управлять как обычным фреймом данных.
Определить файлы
drive_find()
выполняет поиск по свойствам файла, но вы также можете идентифицировать файлы по имени (на самом деле путь) или по идентификатору файла на Диске, используя drive_get()
.
(x <- drive_get("~/abc/def/googledrive-NEWS.md"))
#> ✓ The input `path` resolved to exactly 1 file.
#> # A dribble: 1 × 4
#> name path id drive_resource
#> <chr> <chr> <drv_id> <list>
#> 1 googledrive-NEWS.md ~/abc/def/googledrive-NEWS.md 1h1lhFfQrDZe… <named list […
as_id()
может использоваться для преобразования различных входных данных в отмеченный вектор идентификаторов файлов. Он работает с идентификаторами файлов (по понятным причинам!), Различными формами URL-адресов дисков и т dribble
. Д.
x$id
#> <drive_id[1]>
#> [1] 1h1lhFfQrDZevE2OEX10-rbi2BfvGogFm
# let's retrieve same file by id (also a great way to force-refresh metadata)
drive_get(x$id)
#> # A dribble: 1 × 3
#> name id drive_resource
#> <chr> <drv_id> <list>
#> 1 googledrive-NEWS.md 1h1lhFfQrDZevE2OEX10-rbi2BfvGogFm <named list [39]>
drive_get(as_id(x))
#> # A dribble: 1 × 3
#> name id drive_resource
#> <chr> <drv_id> <list>
#> 1 googledrive-NEWS.md 1h1lhFfQrDZevE2OEX10-rbi2BfvGogFm <named list [39]>
В общем, функции googledrive, которые работают с файлами, позволяют вам указать файл (ы) по имени / пути, идентификатору файла или в формате dribble
. Если это неоднозначно, используйте, as_id()
чтобы пометить вектор символов как содержащий идентификаторы файлов на Диске, а не пути к файлам. Эта функция также может извлекать идентификаторы файлов из различных URL-адресов.
Загрузить файлы
Мы можем загружать файлы любого типа.
(chicken <- drive_upload(
drive_example_local("chicken.csv"),
"index-chicken.csv"
))
#> Local file:
#> • '/private/tmp/RtmpIm6bTU/temp_libpath68f2f2fb7a9/googledrive/extdata/example_files/chicken.csv'
#> Uploaded into Drive file:
#> • 'index-chicken.csv' <id: 14y8vNq9VXYuOuoHsexumu4y73hqBP_RB>
#> With MIME type:
#> • 'text/csv'
#> # A dribble: 1 × 3
#> name id drive_resource
#> <chr> <drv_id> <list>
#> 1 index-chicken.csv 14y8vNq9VXYuOuoHsexumu4y73hqBP_RB <named list [39]>
Обратите внимание, что файл был загружен как text/csv
. Поскольку это был .csv
документ, и мы не указали тип, googledrive угадала тип MIME. Мы можем отменить это, используя type
параметр для загрузки в виде электронной таблицы Google. Давайте сначала удалим этот файл.
drive_rm(chicken)
#> File deleted:
#> • 'index-chicken.csv' <id: 14y8vNq9VXYuOuoHsexumu4y73hqBP_RB>
# example of using a dribble as input
chicken_sheet <- drive_example_local("chicken.csv") %>%
drive_upload(
name = "index-chicken-sheet",
type = "spreadsheet"
)
#> Local file:
#> • '/private/tmp/RtmpIm6bTU/temp_libpath68f2f2fb7a9/googledrive/extdata/example_files/chicken.csv'
#> Uploaded into Drive file:
#> • 'index-chicken-sheet' <id: 17oaVZ09fbpjdV-KMUdcguAD8i1hKeSjNZnq_fbR4iiw>
#> With MIME type:
#> • 'application/vnd.google-apps.spreadsheet'
Намного лучше!
Делиться файлами
Чтобы другие люди могли получить доступ к вашему файлу, вам необходимо изменить права доступа. Вы можете проверить статус совместного использования, запустив drive_reveal(..., "permissions")
, который добавляет логический столбец shared
и сохраняет более подробные метаданные в permissions_resource
переменной.
chicken_sheet %>%
drive_reveal("permissions")
#> # A dribble: 1 × 5
#> name shared id drive_resource permissions_reso…
#> <chr> <lgl> <drv_id> <list> <list>
#> 1 index-chicken-sheet FALSE 17oaVZ09fbpjdV-K… <named list [3… <named list [2]>
Вот как предоставить любому, у кого есть ссылка, разрешение на просмотр этого набора данных.
(chicken_sheet <- chicken_sheet %>%
drive_share(role = "reader", type = "anyone"))
#> Permissions updated:
#> • role = reader
#> • type = anyone
#> For file:
#> • 'index-chicken-sheet' <id: 17oaVZ09fbpjdV-KMUdcguAD8i1hKeSjNZnq_fbR4iiw>
#> # A dribble: 1 × 5
#> name shared id drive_resource permissions_reso…
#> <chr> <lgl> <drv_id> <list> <list>
#> 1 index-chicken-sheet TRUE 17oaVZ09fbpjdV-K… <named list [3… <named list [2]>
Это происходит так часто, что есть даже удобная обертка drive_share_anyone()
.
Публикация файлов
Версии документов, таблиц и презентаций Google можно публиковать в Интернете. Вы можете проверить статус публикации, запустив drive_reveal(..., "published")
, который добавляет логический столбец published
и сохраняет более подробные метаданные в revision_resource
переменной.
chicken_sheet %>%
drive_reveal("published")
#> # A dribble: 1 × 7
#> name published shared id drive_resource permissions_res… revision_resour…
#> <chr> <lgl> <lgl> <drv> <list> <list> <list>
#> 1 index… FALSE TRUE 17oa… <named list [… <named list [2]> <named list [7]>
По умолчанию drive_publish()
будет опубликована ваша самая последняя версия.
(chicken_sheet <- drive_publish(chicken_sheet))
#> File now published:
#> • 'index-chicken-sheet' <id: 17oaVZ09fbpjdV-KMUdcguAD8i1hKeSjNZnq_fbR4iiw>
#> # A dribble: 1 × 7
#> name published shared id drive_resource permissions_res… revision_resour…
#> <chr> <lgl> <lgl> <drv> <list> <list> <list>
#> 1 index… TRUE TRUE 17oa… <named list [… <named list [2]> <named list [9]>
Скачать файлы
Файлы Google
Мы можем скачивать файлы с Google Диска. Собственные типы файлов Google (такие как Документы Google, Таблицы Google, Презентации Google и т. Д.) Необходимо экспортировать в файлы некоторых обычных типов. Существуют разумные значения по умолчанию, или вы можете указать это явно type
или неявно через расширение файла в path
. Например, если я хочу загрузить таблицу Google «chicken_sheet» как файл, .csv
я могу запустить следующее.
drive_download("index-chicken-sheet", type = "csv")
#> File downloaded:
#> • 'index-chicken-sheet' <id: 17oaVZ09fbpjdV-KMUdcguAD8i1hKeSjNZnq_fbR4iiw>
#> Saved locally as:
#> • 'index-chicken-sheet.csv'
В качестве альтернативы я мог бы указать тип через path
параметр.
drive_download(
"index-chicken-sheet",
path = "index-chicken-sheet.csv",
overwrite = TRUE
)
#> File downloaded:
#> • 'index-chicken-sheet' <id: 17oaVZ09fbpjdV-KMUdcguAD8i1hKeSjNZnq_fbR4iiw>
#> Saved locally as:
#> • 'index-chicken-sheet.csv'
Обратите внимание на приведенный выше пример, который я указал overwrite = TRUE
, чтобы перезаписать ранее сохраненный локальный файл CSV.
Наконец, вы можете просто разрешить экспорт в тип по умолчанию. В случае с Google Таблицами это книга Excel:
drive_download("index-chicken-sheet")
#> File downloaded:
#> • 'index-chicken-sheet' <id: 17oaVZ09fbpjdV-KMUdcguAD8i1hKeSjNZnq_fbR4iiw>
#> Saved locally as:
#> • 'index-chicken-sheet.xlsx'
Все остальные файлы
Загрузка файлов, не относящихся к типу файлов Google, еще проще, т. Е. Не требует какого-либо преобразования или информации о типе.
# download it and prove we got it
drive_download("chicken.txt")
#> File downloaded:
#> • 'chicken.txt' <id: 1xMvlJHia_qYNZmucaStDcOF9A9PD4BOT>
#> Saved locally as:
#> • 'chicken.txt'
readLines("chicken.txt") %>% head()
#> [1] "A chicken whose name was Chantecler"
#> [2] "Clucked in iambic pentameter"
#> [3] "It sat on a shelf, reading Song of Myself"
#> [4] "And laid eggs with a perfect diameter."
#> [5] ""
#> [6] "—Richard Maxson"
Очистить
file.remove(c(
"index-chicken-sheet.csv", "index-chicken-sheet.xlsx", "chicken.txt"
))
#> [1] TRUE TRUE TRUE
drive_find("index-chicken") %>% drive_rm()
#> File deleted:
#> • 'index-chicken-sheet' <id: 17oaVZ09fbpjdV-KMUdcguAD8i1hKeSjNZnq_fbR4iiw>