pinsパッケージならリモートファイルをローカルと別のリモートキャッシュできる

カテゴリ: r

さわりのさわりなので、詳しくは公式を参照してね。

pins::pin関数を使うと、Web上のリソースをキャッシュできる。 デフォルトではローカルにキャッシュする。 使い方は簡単で、関数に与えるURLをpins::pin関数でラッピングしておくだけ。

url_penguins <- file.path(
  "https://raw.githubusercontent.com",
  "allisonhorst/palmerpenguins",
  "master/inst/extdata/penguins.csv"
)

str(data.table::fread(pins::pin(url_penguins)))
#> Classes 'data.table' and 'data.frame':   344 obs. of  8 variables:
#>  $ species          : chr  "Adelie" "Adelie" "Adelie" "Adelie" ...
#>  $ island           : chr  "Torgersen" "Torgersen" "Torgersen" "Torgersen" ...
#>  $ bill_length_mm   : num  39.1 39.5 40.3 NA 36.7 39.3 38.9 39.2 34.1 42 ...
#>  $ bill_depth_mm    : num  18.7 17.4 18 NA 19.3 20.6 17.8 19.6 18.1 20.2 ...
#>  $ flipper_length_mm: int  181 186 195 NA 193 190 181 195 193 190 ...
#>  $ body_mass_g      : int  3750 3800 3250 NA 3450 3650 3625 4675 3475 4250 ...
#>  $ sex              : chr  "male" "female" "female" NA ...
#>  $ year             : int  2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...
#>  - attr(*, ".internal.selfref")=<externalptr>

pins::pin関数はローカル上のキャッシュへのパスを返す。

print(pins::pin(url_penguins))
#> [1] "/home/rstudio/.cache/pins/local/penguins/penguins.csv"

2回目以降に同じURLに対してpins::pin関数を実行すると、

  • キャッシュがあるか
  • オンラインか
  • キャッシュが最新か

を確認して、適宜キャッシュを更新してくれる。 キャッシュを使える場合はダウンロードしない分高速。 オフラインでも作業を継続できるのも便利ですね。

また、リモートに「も」キャッシュしておけます。 これにより、

  • キャッシュの共有
  • ソース消滅対策

ができます。 公式なキャッシュ先としては以下に対応。

  • Azure
  • DigitalOcean
  • GitHub
  • Google Cloud
  • Kaggle
  • RStudio Connect
  • S3

GitHubの場合は

  1. キャッシュ保存用のレポジトリを作成
    • 分析用のレポジトリとは分けておくといい。
      • どうせpins::pin関数でキャッシュする
      • gitの差分の重さに悩まずに済む
  2. Personal Access Tokenを発行して、Rに登録
    • 登録はSys.setenv(GITHUB_PAT="<PAT>")が簡単
  3. 以下のようにしてキャッシュする
    • この場合もpins::pin関数はローカルキャッシュのパスを返すことに注目
pins::board_register("github", repo = "atusy/pins-cache-example")

url_penguins <- file.path(
  "https://raw.githubusercontent.com",
  "allisonhorst/palmerpenguins",
  "master/inst/extdata/penguins.csv"
)
print(pins::pin(url_penguins, board="github"))
#> [1] "/home/rstudio/.cache/pins/github/penguins/penguins.csv"

GitHubではここにキャッシュされてます。

https://github.com/atusy/pins-cache-example/tree/master/penguins

Enjoy!!