StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

Rでファイルをダウンロードするかどうか確認させる関数

ネット上にあるcsvファイルをダウンロードしてきて使う場合、read.table()にurlを与えて直接データフレームをつくってしまう場合もあれば、ファイルとしてダウンロードして置いておきたい場合もあります(実行のたびにダウンロードしたくない等の理由で)。
で、実行するときに、すでにダウンロード済みなのであれば再ダウンロード(上書き)はしたくないという場合があるので、確認しながらダウンロードできると便利です。

簡単な処理ではありますが、コードの使い回しのためにここに書いておきます。
そのファイルがすでに存在するかどうかをメッセージで表示した上で、ダウンロードするかどうか訊いてくるので、コンソールでyを入力したらダウンロード、nを入力したら中止ということにしておきます。
ファイルがすでに存在する場合、そのファイルの更新日時を確認してから(たとえば古かったら)ダウンロードしたいという場合もあるので、更新日時も取得して表示するようにしておきます。
処理確認ダイアログを出す関数askYesNo()の使い方は、askYesNoのドキュメントをみてください。

confirm_file_dl <- function(url,dst){
  # dstには保存するときのパス&ファイル名を与える
  
  if(file.exists(dst)) {
    message(paste('\n\"', dst, '\"', ' already exists!', sep=''))
    mtime <- file.info(dst)$mtime  # ファイルの更新日時の取得
    message(paste('(Last modified at ', mtime, ')\n', sep=''))
  } else {
    message(paste('\n\"', dst, '\"', ' doesn\'t exist!\n', sep=''))
  }

    dl_or_not <- askYesNo(msg='Do you want to download the file?', default = FALSE, prompts = 'y/n/na')
  if(dl_or_not==TRUE) {
    download.file(url, destfile = dst)
  }
}


たとえばGoogleのモビリティ・レポートのファイルは、国別データは1ファイルにまとまってるのですが、現時点で600MBもあって、外出中にテザリングで作業してる時なんかは、必要ないならダウンロードしたくないですね。


ファイルがすでに存在する場合。

> confirm_file_dl(url='https://www.gstatic.com/covid19/mobility/Global_Mobility_Report.csv',
+                 dst='source/Global_Mobility_Report.csv')

"source/Global_Mobility_Report.csv" already exists!
(Last modified at 2021-08-17 18:13:17)

Do you want to download the file? (y/n/na) 


ファイルが存在しない場合。(nを入力してダウンロードを実行)

> confirm_file_dl(url='https://www.gstatic.com/covid19/mobility/Global_Mobility_Report.csv',
+                 dst='source/Global_Mobility_Report.csv')

"source/Global_Mobility_Report.csv" doesn't exist!

Do you want to download the file? (y/n/na) y
trying URL 'https://www.gstatic.com/covid19/mobility/Global_Mobility_Report.csv'
Content type 'text/csv' length 637979115 bytes (608.4 MB)
==================================================
downloaded 608.4 MB