0Pricing
R Academy · レッスン

RのEnvironmentとは

親への参照を持つ名前付きリストとしてEnvironmentを学びます。

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

環境とは何か

Rにおけるenvironmentとは、名前付きバインディング(名前付きリストのようなもの)の集合に、parent environmentへのポインターを加えたものです。すべての変数は何らかの環境に属します。Rが名前を検索するときは、まず現在の環境を調べ、その後親の連鎖をたどります。

# The global environment holds your session variables
x <- 42
cat('x is in globalenv:', exists('x', envir = globalenv()), '\n')
cat('globalenv name:', environmentName(globalenv()), '\n')

globalenv()、baseenv()、emptyenv()

Rにはいくつかの組み込み環境があります。globalenv()は対話的なワークスペース、baseenv()はベースRの関数を保持し、emptyenv()は親を持たない連鎖の最上位です。すべての環境チェーンは最終的にemptyenv()で終端します。

cat('global    :', environmentName(globalenv()),  '\n')
cat('base      :', environmentName(baseenv()),    '\n')
cat('empty     :', environmentName(emptyenv()),   '\n')
cat('parent of global:', environmentName(parent.env(globalenv())), '\n')

環境チェーン

emptyenv()を除き、各環境には親が1つだけあります。Rが現在の環境で名前を見つけられない場合、親、その親の親というように、順番に移動します。このチェーンによって、Rは変数名を解決します。

# Walk the parent chain from globalenv
env <- globalenv()
for (i in 1:5) {
  cat(sprintf('Level %d: %s\n', i, environmentName(env)))
  if (identical(env, emptyenv())) break
  env <- parent.env(env)
}

関数に対するenvironment()

すべての関数には、それが作成された環境が関連付けられています。environment(f)はその環境を返します。これは関数のenclosing environmentであり、自由変数をどこから探すかを決定します。

f <- function() 'hello'
cat('f was defined in:', environmentName(environment(f)), '\n')

# Inside a function, environment() returns its own env
show_env <- function() {
  cat('my env:', environmentName(environment()), '\n')
}
show_env()

環境に対するas.list()

as.list(env)は、環境のバインディングを名前付きリストに変換します。これは、環境の内容をプログラムから調べる場合に便利です。globalenv()と組み合わせると、現在のセッションにあるすべての変数を確認できます。

a <- 10
b <- 'hello'
c_val <- TRUE
# Show current global bindings as list
bindings <- as.list(globalenv())
cat('Names in globalenv:', paste(ls(globalenv()), collapse = ', '), '\n')

ls() — 環境の内容を一覧表示

ls()は、環境にバインドされている名前を一覧表示します。デフォルトではグローバル環境が表示されます。envir = eを渡すと、特定の環境を調べられます。all.names = TRUEを追加すると、.で始まる名前も含められます。

my_env <- new.env(parent = emptyenv())
my_env$x <- 1
my_env$y <- 'two'
my_env$.hidden <- TRUE
cat('Default ls:', ls(envir = my_env), '\n')
cat('All names :', ls(envir = my_env, all.names = TRUE), '\n')

new.env() — 環境の作成

new.env(parent = e)は、指定した親を持つ新しい空の環境を作成します。継承されるバインディングがない完全に独立した環境が必要な場合は、親にemptyenv()を指定します。

e <- new.env(parent = emptyenv())
e$name  <- 'Alice'
e$score <- 95
cat('Names:', ls(e), '\n')
cat('Name binding:', e$name, '\n')

環境とリストの違い

環境は名前付きリストのように見えますが、動作は異なります。環境は常にその場で変更され(変更時にコピーされません)、親を持ち、名前の検索にはハッシュテーブルが使われるため高速です。リストは変更時にコピーされますが、環境はコピーされません。

# Environments are reference objects (no copy-on-modify)
e <- new.env(parent = emptyenv())
e$x <- 1
f <- e        # f points to same env, not a copy
f$x <- 99
cat('e$x after modifying through f:', e$x, '\n')

環境での exists() と get()

exists('name', envir = e)は、環境内に名前のバインディングが存在するかどうかを確認します(デフォルトでは親環境も検索します)。get('name', envir = e)は値を取得します。どちらもinherits = FALSEを指定すると、指定した環境だけを検索できます。

e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
cat('exists pi_approx:', exists('pi_approx', envir = e), '\n')
cat('exists missing:  ', exists('missing_var', envir = e), '\n')
cat('get pi_approx:   ', get('pi_approx', envir = e), '\n')

組み込み環境の environmentName()

environmentName(env)は、特殊な環境の人間が読みやすい名前を返します。ユーザーが作成した環境では''(空文字列)が返されます。デバッグ時に変数がどこで定義されたかを追跡するのに役立ちます。

cat(environmentName(globalenv()),    '\n')  # R_GlobalEnv
cat(environmentName(baseenv()),      '\n')  # package:base
cat(environmentName(emptyenv()),     '\n')  # R_EmptyEnv
e <- new.env(parent = emptyenv())
cat('User env name: "', environmentName(e), '"\n', sep = '')

実践:環境をキャッシュとして使う

環境はその場で変更されるため、可変キャッシュやハッシュマップとして適しています。計算結果を環境に保存すると、再計算を避けられます。これは、変更時にコピーが作成されるリストを使うより高速です。

cache <- new.env(parent = emptyenv(), hash = TRUE)
cached_square <- function(n) {
  key <- as.character(n)
  if (exists(key, envir = cache, inherits = FALSE))
    return(get(key, envir = cache))
  result <- n^2
  assign(key, result, envir = cache)
  result
}
cat(cached_square(7), '\n')
cat(cached_square(7), '\n')  # served from cache

確認問題

Rの環境チェーンで最上位にある環境、つまり親を持たない環境は何ですか。

環境:重要なポイント

Rの環境に関する重要なポイント:

  • 環境 = 名前付きバインディング + 親へのポインター
  • globalenv() = ワークスペース、baseenv() = base R、emptyenv() = チェーンの終端
  • 名前の検索は、見つかるかemptyenv()に到達するまで親チェーンを上にたどります
  • ls(envir=e)はバインディングを一覧表示し、exists()は存在を確認し、get()は値を取得します
  • 環境は参照オブジェクトです。そのため、変更時にコピーされません
  • new.env(parent=emptyenv())は独立した環境を作成します
e <- new.env(parent = emptyenv())
assign('counter', 0L, envir = e)
for (i in 1:5) assign('counter', e$counter + 1L, envir = e)
cat('Counter:', e$counter, '\n')
cat('Env name:', environmentName(e), '\n')
cat('Bindings:', ls(e), '\n')

よくある質問

「RのEnvironmentとは」レッスンは無料ですか?

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

「RのEnvironmentとは」で何を学びますか?

親への参照を持つ名前付きリストとしてEnvironmentを学びます。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「RのEnvironmentとは」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. RのEnvironmentとは
  2. レキシカルスコープの規則
  3. グローバルスコープとローカルスコープ
  4. Environmentの作成と確認
← R Academyに戻る