ファイル・システム

1 拡張子

 PC内に存在するほとんどのファイルは「名前.拡張子」と名付けられている1。名前の拡張子は.で区切られており、名前は英数字と_のみで構成することを推奨する(ファイル名に.が推奨されない理由の一つが名前と拡張子を区分する文字として使われるからだ)。ここで注目したいのはファイルの名前でなく、拡張子のことだ。拡張子とはファイルの特徴を示すものである。たとえば、拡張子が.htmlであれば、ウェブページ形式を意味し、.pngなら図、.pdfなら図・文書、.exeなら実行ファイル、.dmgならディスクイメージを意味する。ファイル名がFigure01.pngならFigure01という名の画像ファイルであることを意味する2。この拡張子によって、パソコンは当該ファイルをどのアプリケーションで開くかを判定する。.exeファイルをダブルクリックするとアプリケーションが立ち上がるし、.pdfファイルをダブルクリックするとPDFビュアーソフトが起動され、中身が表示される。

 これは拡張子を変えると問題が生じ得ることを意味する。画像ファイルであるFigure01.pngのファイル名を動画ファイル拡張子であるMovie01.mp4に修正しても、そのファイルは動画ファイルにはならない。また、拡張子が.mp4になると、そのファイルを開く際、動画プレイヤーが起動されるが、ファイルの中身は画像ファイルのままなのでエラーが出る。したがって、拡張子は勝手に変えてはならない。たまに課題の結果物としてファイルを提出する際、自分の名前を入れたくてファイル名をXXXX.htmlからXXXX.html_Songへ変更して提出する場合がある。しかし、これは大きな間違いだ。もやはこのファイルはHTMLファイル(.html)でなく、未知のファイル形式(.html_Song)として認識され、ダブルクリックしてもPCはどのアプリケーションで開けば良いかが分からなくなる。ファイル名を修正するならXXXX_Song.htmlのように修正しよう3

 Rを用いたデータ分析の場面において頻繁に登場する拡張子は以下の通りである。ファイルの名前は大文字と小文字を区別するが、拡張子の場合、区別されないケースが多い。

拡張子 説明 備考
.R Rスクリプトファイル
.Rproj Rプロジェクトファイル
.Rmd R Markdownファイル
.qmd Quartoファイル RMarkdownに似たようなもの
.csv 表形式ファイル 業界標準のフォーマット
.xlsx or .xls 表形式ファイル Excelで使うフォーマット
.dta 表形式ファイル Stataで使うフォーマット
.sav 表形式ファイル SPSSで使うフォーマット
.html ウェブページファイル R Markdown/QuartoをKnitした場合に得られる
.png 画像ファイル
.pdf 画像/文書ファイル 画像にも文書にもなるファイル

2 ファイルシステム

 R上でファイルを入出力を行うためにはファイルシステム(file system)を理解する必要がある。

2.1 ファイルの入出力

 そもそも、ファイルの「入出力」とは何だろうか。これはコンピューターの構造に関わる話なので極めて難しい内容であるが、我々のような消費者(end user)側から見れば、ファイルの入力(input)とは、いわゆるファイルの読み込みを意味し、多くの場合、表形式のデータ(.csv.xlsxなど)をR上に読み込む作業を意味する。また、ファイルの出力(output)とは、いわゆるファイルの保存だ。たとえば、作成したスクリプトを.R形式で保存したり、加工済みのデータを.csv形式で保存したり、作成した図を.png.pdf形式で保存したり、作成した文書を.pdf.html形式で保存したりすることがファイルの出力だ。

2.2 パスとは

 ファイルを読み込む場合はファイル名を指定する必要がある。また、ファイルを書き出す場合もファイルに名付ける必要がある。そしてファイル名は名前.拡張子である。ただし、これらのファイルは全て一箇所に集まっているわけではない。もし、全てのファイルが一箇所に集まっていると、必要なファイルを探すのは非常に難しい。通常、PC内には数万のファイルがある。これらのファイルから必要なファイルを探すのは至難の業だろう。したがって、これらのファイルをいくつかの部屋に分けて保管し、この部屋のことをフォルダー(folder)、またはディレクトリ(directory)と呼ぶ(ここでは「フォルダー」と呼ぶとする)。パス(path)とは特定のファイルの位置と名前の書き方である。つまり、「どこのどのファイルを読み込むか」、「このファイルをどの名前でどこに保存するか」に関する書き方であり、プログラミングを学習する上で必須の知識と言っても過言ではない。

 このパスという概念は我々が住んでいる居住地の「住所」と類似した概念だ。もし、日本に「都道府県」も「市区町村」も「〜丁目、〜番、〜号」という概念がないとしよう。ここでAmazonで魚を購入し、受取先を指定する場合はどうすれば良いだろうか。日本に人が数十人しか住んでいないのであれば、「XXXさんの家」と書くだけで十分かも知れない。しかし、日本には1億人以上の人がある。「ソンさんの家」と書いても届かないだろう。届いたとしても数年、あるいは数十年後に魚の化石の状態で届くかも知れない。そもそも日本に「ソンさん」はこの授業の担当教員以外にもいくらでもいる(ちなみに송(Song; 宋・松)さんも、손(Sohn; 孫)さんも、성(Seong/Sung; 成・星)さんも、선(Sun/Seon; 宣)さんも韓国語では発音が全く別だが、日本ではソンさんになってしまう。)。それぞれの家を何かの区域内に位置づけないとモノが届くまで数年かかってしまう。そこで必要なのが住所だ。「東京都千代田区永田町1丁目7番1号の田中さん」は「東京都」、「千代田区」、「永田町」、「1丁目」、「7番」、「1号」、「田中さん」で構成される。これをファイルシステムに例えると、東京都というフォルダーの中に千代田区というフォルダーがあり、その中には永田町というフォルダー、その中に1丁目といるファルダー、…が存在する。むろん、一つのフォルダーには複数のフォルダーが存在する可能性もある。東京都のフォルダーには千代田区以外にも大田区、中野区、文京区、葛飾区といった複数のフォルダーがあり、千代田区の中にも複数のフォルダーがある。最後の「田中さん」は受け取る人、コンピューターでいうファイル名である。

 この住所と受取人のことをコンピューターではパス(path)と呼ぶ。それぞれのフォルダーは/で区切られる(macOS/Linuxでは/、Windowsでは\または; JDCat分析ツールはLinuxベースであるため、/で区切られる)。先ほどの住所の例だと、東京都/千代田区/永田町/1丁目/7番/1号/田中さんとなる(macOS/Linuxの場合)。左に行くほど上位のフォルダーとなり、最後のものはファイル名である。ただし、コンピュターではパスの最初に/を付ける。Windowsなら主にC:\でスタートし、C:\東京都\千代田区\永田町\1丁目\7番\1号\田中さんとなる(\の代わりにと表示される場合もある)。

 たとえば、以下のような構造でファイルが保存されているとしよう。拡張子が付いているものはファイル、それ以外はフォルダー、1行目の.は最上位フォルダーである。

                      levelName
1  .                           
2   ¦--Day01                   
3   ¦   ¦--Day01.Rproj         
4   ¦   ¦--Script01.R          
5   ¦   ¦--Script02.R          
6   ¦   ¦--Data                
7   ¦   ¦   ¦--raw_data.csv    
8   ¦   ¦   °--cleaned_data.csv
9   ¦   °--Figs                
10  ¦       ¦--Figure01.png    
11  ¦       °--Figure02.png    
12  °--Day02                   
13      ¦--Day02.Rproj         
14      ¦--Script01.R          
15      ¦--Document01.qmd      
16      ¦--Document01.html     
17      ¦--Data                
18      ¦   °--my_data.csv     
19      °--Figs                
20          ¦--Old             
21          ¦   ¦--Figure01.pdf
22          ¦   ¦--Figure02.pdf
23          ¦   °--Figure03.pdf
24          °--New             
25              °--Figure01.png

 ここでread_csv()関数を使ってDay01フォルダー内のDataフォルダー内のraw_data.csvを読み込む場合はread_csv("/Day01/Data/raw_data.csv")となる。また、ggsave()を用いて、Day02内のFigs内のNew内にFigure02.pngという名で図を保存する場合は、ggsave(filename = "/Day02/Figs/New/Figure02.png", ...)と入力する必要がある。しかし、通常、パスを指定する際に、/(WindownならC:\)から始めることは滅多にない。それは「作業フォルダーはパスで省略可能」だからだ。

3 RStudioのプロジェクト機能

 Rでファイルを入出力する時に頭に入れておくべき概念として「作業フォルダー(working folder/working directory)」がある。通常、Rの作業フォルダーはmacOSだと/Users/ユーザー名/、JDCat分析ツールだと/home/joyvan/が作業フォルダーだ。そして、パスを指定する場合、作業フォルダーは省略することができる。つまり、現在の作業フォルダーが/home/joyvan/なら"/home/joyvan/Day01/Data/raw_data.csv""Day01/Data/raw_data.csv"に、"/home/joyvan/Day02/Figs/New/Figure02.png""Day02/Figs/New/Figure02.png"に省略される。我々が郵便局で手紙を送る際、住所にわざわざ「日本国」と書かないものと同じである。作業フォルダーはRコンソール上でgetwd()と入力すれば出力される。macOSなら/Users/ユーザー名、JDCat分析ツールなら/home/joyvanと出力される。

最上位フォルダーの話

 macOSとLinuxに限定した話であるが、最上位フォルダーは/であり、これはシステム上の最上位フォルダーである。個人レベルの最上位フォルダーはmacOSだと/Users/ユーザー名、JDCat分析ツールだと/home/joyvanである。そして、この個人レベルの最上位フォルダーは~/と表記することができる。Rコンソールでgetwd()を入力し、以上のように出力されれば個人レベルの最上位フォルダー(~/)が作業フォルダーになっている理解しても良い。ちなみに、WindowsはC:\がシステム上の最上位フォルダーである。

 もし、自分がこれから全ての作業をDay03という名のフォルダー内で完結するとする。つまり、保存するスクリプト(たとえば、Script.R)もDay03に保存し、図(たとえば、FigureA.png)はDay03Figsフォルダーに、読み込む表形式データ(たとえば、Day03_Data.csv)もDay03の中のDataフォルダーに入れるとする。この場合、それぞれのファイルのパスはDay03/Script.RDay03/Figs/FigureA.pngDay03/Data/Day03_Data.csvとなる(作業フォルダーが~/であるため、~/は省略可能)。全ての作業が同じフォルダー(とその下位フォルダー)内で行うとしたら、パス名にDay03も不要な気がする。そこで必要なのがRStudioのプロジェクト機能である。

 RStudioでDay03というプロジェクトを作成すると、Day03フォルダーが自動的に生成され、Day03.Rprojというファイルも生成される。プロジェクトを最上位フォルダーに作成したのであれば、~/Day03/Day03.Rprojファイルが生成されるのである。ここでRStudioのFile > Open ProjectでこのDay03.Rprojファイルを開くとRStudio画面の右上にプロジェクト名が表示され、作業フォルダーがDay03.Rprojが保存されているフォルダー、つまり~/Day03へ変更される(プロジェクトが開かれていな場合は「Project: (None)」と表示される)。実際、JDCat分析ツールでXXXという名前のプロジェクトを生成し、そのプロジェクトを開けば作業フォルダーは/home/joyvan/XXX/(=~/XXX/)になる(getwd()で確認可能)。これは大変便利な機能である。なぜなら作業フォルダーまでのパスは全て省略可能だからだ。これまでDay03/Script.RDay03/Figs/FigureA.pngDay03/Data/Day03_Data.csvだったパスが、それぞれScript.RFigs/FigureA.pngData/Day03_Data.csvになる。

 また、何らかの理由でDay03フォルダーの名前をDay05に変更したとしよう。もし、プロジェクト機能を使っていないのであれば、パスのDay03を全てDay05に変更する必要がある。しかし、プロジェクト機能を使っているのであれば、.Rprojファイルが存在するフォルダーが作業フォルダーになるため、そもそもパスにDay03は存在しない。つまり、修正不要ということだ。ちなみに、プロジェクトを一旦作成したら、そのプロジェクトのフォルダー名や.Rprojファイルの名前は自由に修正しても良いし、フォルダー名と.Rprojファイルの名前が一致しなくても良い。

 以上の内容を住所と郵便の話で例えるとしよう。社内でも郵便物の行き来は頻繁に行われる。とりわけ面積が広く、キャンパスも複数ある大学なら尚更だ。たとえば、「大阪府吹田市山手町3-3-35 関西大学 ラーメン学部」の宋が「大阪府吹田市山手町3-3-35 関西大学 ラーメン研究支援課」の金に郵便を送る場合、同じ大学であるにも関わらず、住所を全て書くのは面倒なことであろう。ここで関西大学専用の郵便局を作れば問題は解決される(これは「学内便」と呼ばれる)。そうすれば差出人は「ラーメン学部 宋」、受取人は「ラーメン研究支援課 金」と書くだけで郵便物は届く。つまり、「大阪府吹田市山手町3-3-35 関西大学」は省略できる(同じ市区町村内の引っ越した際、転入・転出届けの住所欄に市区町村名までは省略できるのと同じ)。また、関西大学がなぜかキャンパスを沖縄に移転した場合を考えてみよう(もはや関西大学ではないが…)。学内便がなければ、郵便物の住所を全て「沖縄県〜」に変えなければならない。しかし、学内便が存在すればこれまで使ってきた「ラーメン学部 宋」という表記は有効であろう。

 このようにRStudioのプロジェクト機能は必須といっても過言ではない。簡単な計算目的として使う場合は問題ないが、何かの分析をする時、授業の実習時、課題時には必ずRStudioの右上が「Project: (None)」になっていないことを確認しよう。

絶対パスと相対パス

 これまで紹介したパスの書き方で/(WindowsならC:\)から始まるパスは、絶対パス(absolute path)またはフルパス(full path)と呼ばれる。これはファイル名を最上位フォルダーを起点に書く方法である。一方、/(WindowsならC:\)で始まらないパスは相対パス(relative path)呼ばれ、ファイル名を作業フォルダーを起点に書く方法である。

4 本講義でおすすめするフォルダー構造

 プロジェクトを作成すれば、プロジェクトフォルダー内に以下のようなフォルダーを作成しよう。

  • 表形式のデータを読み込んだり、保存したりするのであればDataフォルダーをプロジェクトフォルダー内に作成する。
    • .csv.xlsx.sav.dtaのような表形式ファイルはDataフォルダーに入れる。
    • データを加工し、保存する場合はData/ファイル名.csvなどと指定する。
  • 図を作成し、保存する予定があれば、Figsフォルダーをプロジェクトフォルダー内に作成する。
    • 図を保存する場合、ファイルのパスをFigs/ファイル名.pngFigs/ファイル名.pdfとする。

 よく分からない場合はとりあえずプロジェクトフォルダー内にDataFigsというフォルダーを作っておこう。ただし、.R.qmdなどコードファイルはプロジェクトフォルダーの下位フォルダーに入れず、プロジェクトフォルダーの直に入れよう4。この場合、R Markdown / Quartoで作成された文書(.html.pdfなど)は.Rmd.qmdファイルと同じフォルダーに保存される(別途の設定をすれば別フォルダーに保存することも可能だが、そこまではしなくても良い)。

5 参考

 以下の内容も合わせて読むことを強く推奨する。

  1. 一部、拡張子を持たないファイルもある。↩︎

  2. 文書ファイルが.pdf以外にも.docx.odt.txtなどがあるように、画像ファイルも.pngだけでなく、.jpg.gif.bmp.svgなど様々なフォーマットがある。↩︎

  3. ただし、LMSに提出する場合、ファイル名をわざわざ修正しなくても良い。教員側からダウンロードする際、勝手に学生番号と氏名が付いたファイル名になるからだ。↩︎

  4. 人によってはスクリプトファイルをScriptフォルダー内に入れる人もいるが推奨しない。とりわけ、R MarkdownやQuartoの場合、コンソール上で実行時のパスとKnit時のパスの扱いが異なる場合が多い。プロジェクトフォルダーに入れておけば、問題は解決される。↩︎