からっぽのしょこ

読んだら書く!書いたら読む!同じ事は二度調べ(たく)ない

5-3:googledriveパッケージによるファイルのアップロード【R登山本】

はじめに

 『Rが生産性を高める 〜データ分析ワークフロー効率化の実践』(R登山本)の内容を実際にやってみた記録や気になったことのメモです。

 この記事は、5-3節「Googleドライブの操作」の補足的な内容です。詳しくは本を読んでください。

【前の内容】

www.anarchive-beta.com

【この記事の内容】

5-3 ファイルのアップロードと更新

 認証方法などの初期設定やドライブ上でのファイルの操作、ファイルの共有などについては本を読んでください。

メタデータ

 まずは、Google Drive上のファイルのメタデータについて簡単に確認します。メタデータはファイルのアップロードにも利用します。
 不要であれば、グラフが登場した先まで飛ばしてください。

 利用するパッケージを読み込みます。

# 利用するパッケージ
library(googledrive)


 Googleドライブ上のファイルのメタデータを取得します。

# ファイルのメタデータを取得
metadata <- drive_get(path = "tozan_book/chapter5/sample.png")
metadata
## # A dribble: 1 x 4
##   name       path                             id             drive_resource
##   <chr>      <chr>                            <drv_id>       <list>        
## 1 sample.png ~/tozan_book/chapter5/sample.png 1QHy1C9Was_St~ <named list>

 drive_get()にファイルパスを指定すると、ファイルのメタデータを取得できます。
 ファイルパスは、ファイルが保存されている場所を示すもので、ファイルが保存されている「フォルダ名」と「ファイル名」を/で繋いだものです。フォルダが入れ子になっている場合は、親フォルダ名/子フォルダ名/ファイル名.拡張子になります。

 メタデータはデータフレーム(dribbleオブジェクト)で出力されます。name列にファイル名、path列にファイルパス、id列にファイルID、drive_resource列にGoogleアカウント情報などが格納されています。

 ファイルIDを取り出します。

# ファイルIDを取り出し
file_id <- as_id(metadata)
file_id <- metadata[["id"]]
file_id
## <drive_id[1]>
## [1] 1QHy1C9Was_St_K2c-DhY0MY30Hoy9jyt

 as_id()dribbleオブジェクトを渡すと、ファイルID(drive_idオブジェクト)を返します。
 列名を指定して取り出すこともできます。

 文字列から変換することもできます。

# ファイルIDに変換
file_id <- as_id("rrsskkymmmhu")
file_id
## <drive_id[1]>
## [1] rrsskkymmmhu

 as_id()に文字列を渡すと、drive_idオブジェクトに変換して返します。

 Googleドライブ上のフォルダのメタデータを取得します。

# フォルダのメタデータを取得
metadata <- drive_get(path = "tozan_book/chapter5/")
metadata
## # A dribble: 1 x 4
##   name     path                   id                         drive_resource
##   <chr>    <chr>                  <drv_id>                   <list>        
## 1 chapter5 ~/tozan_book/chapter5/ 1S3AFE9i8BuNEp9wfmJFLkWEi~ <named list>

 drive_get()にフォルダパスを指定すると、フォルダのメタデータを取得できます。

 ファイルパスとファイルIDについて確認しました。(話が前後しますが)次からは、ローカル(PC上)のファイルをGoogleドライブに保存する方法を確認していきます。

ファイルのアップロード

 googledriveパッケージを利用してGoogle Driveにファイルをアップロードする方法を3パターン(drive_upload()drive_update()drive_put())確認します。

 利用するパッケージを読み込みます。

# 利用するパッケージ
library(googledrive)
library(palmerpenguins)
library(ggplot2)

 palmerpenguinsggplot2は、例として使用するファイルの作成に使います。

 例として用いる画像ファイルを作成しておきます。

 ペンギンデータセットを取得します。

# データセットを取得
penguins_df <- palmerpenguins::penguins
head(penguins_df)
## # A tibble: 6 x 8
##   species island bill_length_mm bill_depth_mm flipper_length_~ body_mass_g sex  
##   <fct>   <fct>           <dbl>         <dbl>            <int>       <int> <fct>
## 1 Adelie  Torge~           39.1          18.7              181        3750 male 
## 2 Adelie  Torge~           39.5          17.4              186        3800 fema~
## 3 Adelie  Torge~           40.3          18                195        3250 fema~
## 4 Adelie  Torge~           NA            NA                 NA          NA <NA> 
## 5 Adelie  Torge~           36.7          19.3              193        3450 fema~
## 6 Adelie  Torge~           39.3          20.6              190        3650 male 
## # ... with 1 more variable: year <int>

 palmerpenguinsパッケージのpenguinsデータセットを利用します。

 散布図を作成します。

# 散布図を作成
graph <- ggplot(data = penguins_df, mapping = aes(x = body_mass_g, y = bill_length_mm)) + 
  geom_point(mapping = aes(color = species, shape = species), size = 3) + 
  labs(title = "palmerpenguins")
print(graph)

サンプルデータ


 作成したグラフを画像ファイルとして保存します。

# 画像を書き出し
ggplot2::ggsave(
  filename = "data/sample.png", 
  plot = graph, 
  dpi = 100, width = 8, height = 6
)

 ggsave()で、グラフを保存します。
 filename引数に、「画像を保存するローカルのフォルダ名(フォルダパス)」と「保存する際に名付けるファイル名」を組み合わせた「ファイルパス」を指定します。
 plot引数に、作成したグラフのデータを指定します。
 dpi引数は1インチ当たりのドット数、wide引数は出力時の横のサイズ(インチ)、height引数は縦のサイズ(インチ)です。この例だと800×600インチのpngファイルが出力されます。

 さて次からが本題です。例として、PC上の「dataフォルダ」に保存されている「画像ファイルsample.png」を、Googleドライブ上の「tozan_bookフォルダ」の中の「chapter5フォルダ」に「sample.png」というファイル名でアップロード(作成・保存)します。

drive_upload

 drive_upload()を使って、Googleドライブにファイルをアップロードします。

 まずは、ファイルパスを用いる方法です。

# パスを用いてファイルをアップロード
drive_upload(
  media = "data/sample.png", 
  path = "tozan_book/chapter5/sample.png", 
  overwrite = TRUE
)

 media引数に、アップロードする(ローカルに保存されている)ファイルのパスを指定します。
 path引数に、「Googleドライブ上のフォルダ名(フォルダパス)」と「保存する際に名付けるファイル名」を組み合わせたファイルパスを指定します。元のファイル名とアップロード後のファイル名が同じである必要はありません。
 overwrite引数は、Googleドライブ上に同名のファイルが既に存在する場合の処理を指定します。デフォルトはNAで、重複してファイルを作成(アップロード)します。TRUEを指定すると、ファイルを置き換えます。FALSEだと、ファイルをアップロードしません。

 アップロードできると、次のように表示されます。

## Local file:
## * '[元のファイルパス]'
## Uploaded into Drive file:
## * '[作成したファイル名]' <id:<U+00A0>[ファイルID]>
## With MIME type:
## * '[ファイルの種類]'


 同名のファイルが既に存在しており、ファイルが置き替えられた場合は、次のように表示されます。

## File trashed:
## * '[ドライブ上のファイル名]' <id:<U+00A0>[旧ファイルID]>
## Local file:
## * '[元のファイルパス]'
## Uploaded into Drive file:
## * '[ドライブ上のファイル名]' <id:<U+00A0>[新ファイルID]>
## With MIME type:
## * '[ファイルの種類]'

 ファイルが置き換わるとファイルIDが変わります。元々あったファイルはゴミ箱に移動します。

 アップロードしたファイルのIDを確認してみます。

# ファイルIDを確認
drive_get(path = "tozan_book/chapter5/sample.png") %>% 
  as_id()
## <drive_id[1]>
## [1] 1zbzUZ_RTzLY_bkxG19nKZl_Ukvghbml-


 次のようにも引数を指定できます。

# パスを用いてファイルをアップロード
drive_upload(
  media = "data/sample.png", 
  path = "tozan_book/chapter5/", 
  name = "sample.png", 
  overwrite = TRUE
)

drive_upload(
  media = "data/sample.png", 
  path = "tozan_book/chapter5/", 
  overwrite = TRUE
)

 path引数に保存するフォルダパスを指定して、name引数に作成するファイル名を指定します。
 path引数にフォルダパスを指定して、name引数を指定しない場合は、元のファイル名になります。

 続いて、ファイルIDを用いる方法です。

# フォルダのメタデータを取得
metadata <- drive_get(path = "tozan_book/chapter5/")
metadata
## # A dribble: 1 x 4
##   name     path                        id                         drive_resource
##   <chr>    <chr>                       <drv_id>                   <list>        
## 1 chapter5 ~/tozan_book/chapter5/      1S3AFE9i8BuNEp9wfmJFLkWEi~ <named list>

 drive_get()で、ファイルをアップロードする「フォルダのメタデータ」を取得します。ファイルそのものではなく、フォルダなのに注意してください。
 id列にファイルIDが格納されています。

 取得したファイルIDを用いてファイルをアップロードします。

# ファイルIDを用いてファイルをアップロード
drive_upload(
  media = "data/sample.png", 
  path = metadata[["id"]], 
  overwrite = TRUE
)

drive_upload(
  media = "data/sample.png", 
  path = as_id(metadata), 
  overwrite = TRUE
)

drive_upload(
  media = "data/sample.png", 
  path = metadata, 
  overwrite = TRUE
)

 file引数に、ファイルID(drive_idオブジェクト)またはメタデータ(dribbleオブジェクト)を指定します。
 media引数に、アップロードする(ローカルに保存されている)ファイルのパスを指定します。

 ファイルIDを確認します。

# ファイルIDを確認
drive_get(path = "tozan_book/chapter5/sample.png") %>% 
  as_id()
## <drive_id[1]>
## [1] 1NbOOQ6ChGfUd3-zL6EMd-m1yUNflchAf

 ファイルIDが変わりました。

 画像ファイル以外もアップロードできます。

# データフレームを書き出し
readr::write_csv(penguins_df, file = "data/sample.csv")

# データをアップロード
drive_upload(
  media = "data/sample.csv", 
  path = "tozan_book/chapter5/", 
  name = "sample.csv", 
  overwrite = TRUE
)

 csvファイルの場合は、ファイル名の拡張子をcsvにします。

drive_update

 既に存在するファイルを置き換える場合にはdrive_update()を利用できます。

 まずは、ファイルパスを用いる方法です。

# パスを用いてファイルを更新
drive_update(
  file = "tozan_book/chapter5/sample.png", 
  media = "data/sample.png"
)

 file引数に、Googleドライブ上に既に保存されているファイルパスを指定します。
 media引数に、アップロードする(ローカルに保存されている)ファイルのパスを指定します。

 ファイルを更新できた場合は、次のように表示されます。

## File updated:
## * 'sample.png' <id:<U+00A0>[元のファイルID]>

 drive_update()でファイルが置き換えた場合は、ファイルIDが変わりません。

 続いて、ファイルIDを用いる方法です。

# ファイルのメタデータを取得
metadata <- drive_get(path = "tozan_book/chapter5/sample.png")
metadata
## # A dribble: 1 x 4
##   name       path                             id             drive_resource
##   <chr>      <chr>                            <drv_id>       <list>        
## 1 sample.png ~/tozan_book/chapter5/sample.png 1NbOOQ6ChGfUd~ <named list>

 drive_get()で、更新する「ファイルのメタデータ」を取得します。こちらは、ファイル自体のメタデータを使います。

 取得したファイルIDを用いてファイルをアップロードします。

# メタデータを用いてファイルを更新
drive_update(
  file = metadata[["id"]], 
  media = "data/sample.png"
)

drive_update(
  file = as_id(metadata), 
  media = "data/sample.png"
)

drive_update(
  file = metadata, 
  media = "data/sample.png"
)

 file引数に、ファイルID(drive_idオブジェクト)またはメタデータ(dribbleオブジェクト)を指定します。
 media引数に、アップロードする(ローカルに保存されている)ファイルのパスを指定します。

 ファイルIDを確認してみます。

# ファイルIDを確認
drive_get(path = "tozan_book/chapter5/sample.png") %>% 
  as_id()
## <drive_id[1]>
## [1] 1NbOOQ6ChGfUd3-zL6EMd-m1yUNflchAf

 ファイルIDが変わっていません。

drive_put

 最後に、drive_put()を使ってアップロードします。

 まずは、ファイルパスを用いる方法です。

# ファイルパスを用いてファイルをアップロードor更新
drive_put(
  media = "data/sample.png", 
  path = "tozan_book/chapter5/sample.png"
)

 media引数に、アップロードする(ローカルに保存されている)ファイルのパスを指定します。
 path引数に、「Googleドライブ上のフォルダ名(フォルダパス)」と「保存する際に名付けるファイル名」を組み合わせたファイルパスを指定します。元のファイル名とアップロード後のファイル名が同じである必要はありません。

 新たにファイルが作成された(同名のファイルがなかった)場合は次のように表示されます。

## i No pre-existing Drive file at this path. Calling `drive_upload()`.
## Local file:
## * 'data/sample.png'
## Uploaded into Drive file:
## * 'sample.png' <id:<U+00A0>[ファイルID]>
## With MIME type:
## * 'image/png'

 drive_upload()によってファイルがアップロードされたことが分かります。

 ファイルが置き替えられた(同名のファイルがあった)場合は次のように表示されます。

## i A Drive file already exists at this path. Calling `drive_update()`.
## File updated:
## * 'sample.png' <id:<U+00A0>[元のファイルID]>

 drive_update()によってファイルがアップデートされたことが分かります。そのため、ファイルIDは変わりません。

 drive_upload()と同様に、name引数を指定できます。

# ファイルパスを用いてファイルをアップロードor更新
drive_put(
  media = "data/sample.png", 
  path = "tozan_book/chapter5/", 
  name = "sample.png"
)

drive_put(
  media = "data/sample.png", 
  path = "tozan_book/chapter5/"
)

 path引数に保存するフォルダパスを指定して、name引数に作成するファイル名を指定します。
 path引数にフォルダパスを指定して、name引数を指定しない場合は、元のファイル名になります。

 続いて、ファイルIDを用いる方法です。

# フォルダのメタデータを取得
metadata <- drive_get(path = "tozan_book/chapter5/")
metadata
## # A dribble: 1 x 4
##   name     path                   id                         drive_resource
##   <chr>    <chr>                  <drv_id>                   <list>        
## 1 chapter5 ~/tozan_book/chapter5/ 1S3AFE9i8BuNEp9wfmJFLkWEi~ <named list>

 drive_get()で、更新するファイルが保存されている「フォルダのメタデータ」を取得します。ファイルそのものではなく、フォルダなのに注意してください。

 取得したファイルIDを用いてファイルをアップロードします。

# メタデータを用いてファイルをアップロードor更新
drive_put(
  media = "data/sample.png", 
  path = metadata[["id"]], 
  name = "sample.png"
)

drive_put(
  media = "data/sample.png", 
  path = as_id(metadata), 
  name = "sample.png"
)

drive_put(
  media = "data/sample.png", 
  path = metadata, 
  name = "sample.png"
)

 path引数に、保存するフォルダのファイルIDを指定して、name引数にファイル名を指定します。

 ファイルIDを確認してみます。

# ファイルIDを確認
drive_get(path = "tozan_book/chapter5/sample.png") %>% 
  as_id()
## <drive_id[1]>
## [1] 1NbOOQ6ChGfUd3-zL6EMd-m1yUNflchAf

 ファイルIDが変わっていません。

 以上で、Google Driveにファイルをアップロードする方法を確認できました。

参考書籍

  • 「Rが生産性を高める 〜データ分析ワークフロー効率化の実践」igjit・atusy・hanaori 著,技術評論社,2022年.

おわりに

 これまではローカルに保存してGoogleドライブの同期機能を使ってましたが、直接アップロードできるんですね。自分が一番使いそうな機能なので、深掘りしてみました。

【次の内容】

www.anarchive-beta.com