R Academy · レッスン

作業ディレクトリとファイルパス

getwd()、setwd()、here()を使って、クロスプラットフォームで信頼できるパスを扱います。

レッスン 3/413 ステップ

「作業ディレクトリとファイルパス」はCoddyKit上の無料R Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

作業ディレクトリとは

作業ディレクトリは、相対パスでファイルを参照するときに R が開始点として使うフォルダーです。完全なパスを指定しない場合に、R がファイルを探し、ファイルを書き込むデフォルトの場所です。R の各セッションには、常に1つの作業ディレクトリがあります。

# getwd() returns the current working directory
current_dir <- getwd()
cat('Working directory:', current_dir)

# All relative file references start from this location:
# read.csv('data.csv')         <- looks in current_dir/data.csv
# source('R/helpers.R')        <- looks in current_dir/R/helpers.R

setwd() — 作業ディレクトリの変更

setwd() は、現在の R セッションの作業ディレクトリを変更します。変更前の作業ディレクトリを不可視の形で返すため、状態の復元に便利です。注意:プロジェクトベースのワークフローでは、スクリプト内での setwd() の使用は推奨されません。

# Set a new working directory
old_dir <- setwd('/tmp')
cat('Now in:', getwd(), '\n')

# Restore original directory
setwd(old_dir)
cat('Restored to:', getwd(), '\n')

# Common anti-pattern (breaks on other machines):
# setwd('/Users/alice/Desktop/my_project')  <- hardcoded!

# Better: use RStudio Projects which set wd automatically

file.path() — 移植可能なパスの構築

file.path() は、コンポーネントをオペレーティングシステムに適した区切り文字で結合してファイルパスを構築します(Mac/Linux では /、Windows では \)。クロスプラットフォーム互換性のため、文字列連結ではなく必ずこれを使ってください。

# Build a path from components
data_path <- file.path('data', 'raw', 'sales.csv')
cat('Path:', data_path)
# On Unix:    data/raw/sales.csv
# On Windows: data\raw\sales.csv

# Multiple levels
output_file <- file.path('output', '2024', 'Q1', 'report.pdf')
cat('Output:', output_file)

# Combine with getwd() for a full absolute path
full_path <- file.path(getwd(), 'data', 'sales.csv')
cat('Full path:', full_path)

normalizePath() — 絶対パスへの解決

normalizePath() は相対パスを正規の絶対パスに変換し、.(現在のディレクトリ)や ..(親ディレクトリ)の要素を解決します。あいまいさのないファイルの場所を保存またはログに記録する必要がある場合に不可欠です。

# Resolve relative paths to absolute
abs_path <- normalizePath('.')
cat('Absolute cwd:', abs_path, '\n')

# Resolve a relative path
data_abs <- normalizePath(file.path('..', 'data', 'sales.csv'),
                          mustWork = FALSE)
cat('Resolved:', data_abs, '\n')

# mustWork = FALSE: do not error if file does not exist yet
# mustWork = TRUE (default): error if path does not exist

# Useful for building reliable log messages or config files
cat('normalizePath demo complete')

dirname() と basename()

dirname() はパスのディレクトリ部分を抽出し、basename() はファイル名部分を抽出します。これらは Unix の dirname および basename シェルコマンドに相当する R の関数です。

path <- '/Users/alice/projects/analysis/data/sales_2024.csv'

# Extract the directory
folder <- dirname(path)
cat('Directory:', folder, '\n')
# /Users/alice/projects/analysis/data

# Extract the file name
filename <- basename(path)
cat('File name:', filename, '\n')
# sales_2024.csv

# Remove file extension
name_only <- tools::file_path_sans_ext(filename)
cat('Name only:', name_only)

file.exists() — 読み込み前の確認

分かりにくいエラーメッセージを避けるため、読み込もうとする前にファイルが存在するかどうかを必ず確認してください。file.exists() は TRUE または FALSE を返し、ファイルとディレクトリの両方に対応します。

data_file <- file.path('data', 'sales.csv')

# Check existence before reading
if (file.exists(data_file)) {
  cat('File found, loading...\n')
  # df <- read.csv(data_file)
} else {
  cat('File not found:', data_file, '\n')
  stop('Cannot proceed without data file.')
}

# Check multiple files at once
files <- c('data/a.csv', 'data/b.csv', 'data/c.csv')
exists_vec <- file.exists(files)
cat('Files found:', sum(exists_vec), 'of', length(files))

Sys.getenv() — 環境変数によるパス

環境変数には、ホームディレクトリ、テンポラリフォルダー、カスタムアプリパスなど、システムレベルのパスが保存されます。Sys.getenv() でこれらの値を読み取ると、パスをハードコードせず、異なるシステムに対応できるコードになります。

# Get the home directory
home_dir <- Sys.getenv('HOME')
cat('Home:', home_dir, '\n')

# Get the temp directory
tmp_dir <- Sys.getenv('TMPDIR')
cat('Temp:', tmp_dir, '\n')

# Custom environment variable (set in .Renviron)
data_root <- Sys.getenv('DATA_ROOT', unset = '/default/data')
cat('Data root:', data_root, '\n')

# Use env vars to build portable paths
config_file <- file.path(home_dir, '.config', 'myapp', 'settings.json')
cat('Config path:', config_file)

path.expand() — チルダ展開

チルダ ~ は Unix 系システムでホームディレクトリを表す省略記法ですが、R のファイル関数は常に自動展開するとは限りません。path.expand() は ~ を実際のホームディレクトリのパスに置き換えます。

# Expand tilde to full home path
short_path <- '~/.Rprofile'
full_path  <- path.expand(short_path)
cat('Expanded:', full_path)
# e.g. /Users/alice/.Rprofile

# Useful when passing paths to external tools or logging
config_dir <- path.expand('~/.config/R')
cat('Config dir:', config_dir)

# Can expand multiple paths at once
paths <- c('~/data', '~/output', '~/scripts')
expanded <- path.expand(paths)
cat(expanded, sep = '\n')

list.files() によるファイル一覧の取得

list.files()(別名 dir())は、ディレクトリ内のファイルを一覧表示します。パターンで絞り込んだり、完全なパスを返したりすることもできます。フォルダー内の複数ファイルを処理する必要がある場合に不可欠です。

# List all files in current directory
all_files <- list.files('.')
cat('Files found:', length(all_files), '\n')

# Filter by extension
csv_files <- list.files('data', pattern = '\\.csv$', full.names = TRUE)
cat('CSV files:',  length(csv_files), '\n')

# Recursive: include subdirectories
r_files <- list.files('R', pattern = '\\.R$',
                       full.names = TRUE, recursive = TRUE)
cat('R scripts:', length(r_files))

パスの作成と削除

R には、ディレクトリの作成やファイルの管理を行う組み込み関数があります。新しいフォルダーの作成には dir.create() を使い、recursive = TRUE を指定するとネストしたパスも作成できます。一時ファイルの削除には file.remove() を使います。

# Create a directory (will not error if it already exists)
dir.create('output/figures', recursive = TRUE, showWarnings = FALSE)
cat('Directory created\n')

# Create a temporary file
tmp_file <- tempfile(fileext = '.csv')
write.csv(data.frame(x = 1:3), tmp_file, row.names = FALSE)
cat('Temp file:', tmp_file, '\n')

# Remove the file when done
if (file.remove(tmp_file)) {
  cat('Temp file cleaned up')
}

here パッケージ — プロジェクト相対パス

here パッケージは、作業ディレクトリの問題を洗練された方法で解決します。here::here() は、プロジェクト内のどこから呼び出しても、プロジェクトルート(.Rproj ファイルがある場所)を基準にパスを構築します。

# install.packages('here')
# library(here)

# Always resolves from project root:
# here('data', 'raw', 'sales.csv')
# here('R', 'helpers.R')
# here('output', 'report.html')

# Without here: setwd() headaches when script is in a subfolder
# With here: same path works from any subfolder

# Demonstrate base-R equivalent approach:
project_root <- normalizePath(file.path(getwd(), '..'), mustWork = FALSE)
data_path    <- file.path(project_root, 'data', 'sales.csv')
cat('Data path:', data_path)

クイックチェック

パス文字列 'data/raw/../clean/sales.csv' があります。これを解決して、正規化された絶対パスにするには、どの関数を使いますか?

ファイルパス — 重要ポイント

再現性のある R スクリプトには、堅牢なファイルパス処理が不可欠です。

  • getwd() / setwd() — 作業ディレクトリを取得・設定します
  • file.path('a', 'b', 'c.csv') — OS に依存しないパスを構築します
  • normalizePath(path, mustWork = FALSE) — 絶対パスに解決します
  • dirname() / basename() — パスをフォルダーとファイルに分割します
  • file.exists() — 読み込む前に存在を確認します
  • Sys.getenv('HOME') — 環境変数を介してシステムパスにアクセスします
  • path.expand('~') — チルダをホームディレクトリに展開します
  • list.files(pattern = '\.csv$') — 拡張子でファイルを検索します
  • dir.create(recursive = TRUE) — 入れ子になったディレクトリを安全に作成します
  • RStudio プロジェクトでプロジェクト相対パスを扱うには、here パッケージを使います
# Robust file loading pattern:
data_file <- file.path('data', 'raw', 'sales.csv')

if (!file.exists(data_file)) {
  stop(paste('Missing file:', normalizePath(data_file, mustWork = FALSE)))
}

# df <- read.csv(data_file)
cat('File path:', data_file, '\n')
cat('Full path:', normalizePath(data_file, mustWork = FALSE))
無料で開始

AI チューターと学ぶ R — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
43
レッスン
159

よくある質問

「作業ディレクトリとファイルパス」レッスンは無料ですか?

はい。「作業ディレクトリとファイルパス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「作業ディレクトリとファイルパス」で何を学びますか?

getwd()、setwd()、here()を使って、クロスプラットフォームで信頼できるパスを扱います。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「作業ディレクトリとファイルパス」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. source()によるスクリプトの読み込み
  2. コメント、スタイル、可読性
  3. 作業ディレクトリとファイルパス
  4. Rプロジェクトとワークスペース管理
← R Academyに戻る