0Pricing
R Academy · レッスン

Environmentの作成と確認

new.env()、environment()、ls()、get()を使ってEnvironmentを操作します。

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

新しい環境の作成

new.env(parent = e)は新しい空の環境を作成します。parent引数は、新しい環境で名前が見つからないときに検索する環境を指定します。完全に独立した環境にはemptyenv()を使います。

# Isolated environment (no parent chain)
e1 <- new.env(parent = emptyenv())
# Environment with global as parent
e2 <- new.env(parent = globalenv())
cat('e1 parent:', environmentName(parent.env(e1)), '\n')
cat('e2 parent:', environmentName(parent.env(e2)), '\n')

assign() — バインディングの追加

assign('name', value, envir = e)は、指定した環境に名前付きバインディングを作成または更新します。e$name <- valueと同等のプログラム上の操作ですが、名前が変数に格納されている場合にも使えます。

e <- new.env(parent = emptyenv())
assign('x', 10, envir = e)
assign('y', 'hello', envir = e)
assign('z', TRUE, envir = e)
cat('x:', get('x', envir = e), '\n')
cat('y:', get('y', envir = e), '\n')

get() と mget()

get('name', envir = e)は単一のバインディングを取得します。mget(c('a','b'), envir = e)は複数のバインディングを一度に取得し、名前付きリストを返します。名前が存在しない場合、inheritsによってチェーン検索が許可されていない限り、どちらもエラーを発生させます。

e <- new.env(parent = emptyenv())
e$alpha <- 1
e$beta  <- 2
e$gamma <- 3
# Single
get('alpha', envir = e)
# Multiple
mget(c('alpha', 'beta', 'gamma'), envir = e)

ls() — バインディングの一覧表示

ls(envir = e)は、環境eにバインドされているすべての名前を文字ベクトルとして返します。all.names = TRUEを追加すると、通常は隠されている.で始まる名前も含められます。名前はアルファベット順で返されます。

e <- new.env(parent = emptyenv())
e$b_val  <- 2
e$a_val  <- 1
e$.secret <- 'hidden'
cat('Default ls:', ls(envir = e), '\n')
cat('All names :', ls(envir = e, all.names = TRUE), '\n')

inherits を指定した exists()

exists('name', envir = e, inherits = FALSE)は、親環境を検索せず、指定した環境だけを確認します。inherits = TRUE(デフォルト)では、親チェーンも検索します。厳密にローカル環境だけを確認する場合は、inherits = FALSEを使います。

parent_e <- new.env(parent = emptyenv())
parent_e$shared <- 42
child_e  <- new.env(parent = parent_e)
# inherits=TRUE: finds shared in parent
cat('inherits TRUE:', exists('shared', envir = child_e, inherits = TRUE),  '\n')
# inherits=FALSE: only looks in child
cat('inherits FALSE:', exists('shared', envir = child_e, inherits = FALSE), '\n')

environmentName() と parent.env()

environmentName(e)は、組み込み環境の名前('R_GlobalEnv'、'package:base'など)を返します。ユーザーが作成した環境では''が返されます。parent.env(e)は親環境オブジェクトを返します。

e <- new.env(parent = globalenv())
cat('Name of e     :', environmentName(e), '\n')
cat('Parent of e   :', environmentName(parent.env(e)), '\n')
cat('Name of global:', environmentName(globalenv()), '\n')

環境の $ 構文

環境では、リストと同様に$および[[構文を使ってバインディングを読み書きできます。書き込み時に名前が決まっている場合、直接アクセスする方法としてget()やassign()より便利なことがよくあります。

e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
e[['e_approx']] <- 2.71828
cat('pi:', e$pi_approx, '\n')
cat('e :', e[['e_approx']], '\n')

特定の環境での rm()

rm('name', envir = e)は、特定の環境からバインディングを削除します。グローバル変数を削除する場合とは異なり、カスタム環境を扱うときは環境を明示的に指定する必要があります。

e <- new.env(parent = emptyenv())
e$keep <- 1
e$remove_me <- 99
cat('Before:', ls(envir = e), '\n')
rm('remove_me', envir = e)
cat('After :', ls(envir = e), '\n')

環境を一覧に変換する as.list()

as.list(e)は、環境内のすべてのバインディングを名前付きリストに変換するため、内容を調べたりシリアライズしたりしやすくなります。結果はスナップショットなので、その後の環境の変更はリストに反映されません。

e <- new.env(parent = emptyenv())
e$x <- 10
e$y <- 20
e$z <- 30
bindings <- as.list(e)
cat('Class:', class(bindings), '\n')
cat('Length:', length(bindings), '\n')
str(bindings)

ハッシュテーブルとしての環境

new.env()のhash = TRUEオプション(親が設定されている場合のデフォルト)は、ハッシュベースの検索を有効にし、名前の検索をO(1)にします。そのため、大規模な環境でのキーと値の格納は、リストよりもはるかに高速になります。

# Build a small key-value store
store <- new.env(hash = TRUE, parent = emptyenv())
keys   <- paste0('key_', 1:5)
values <- c(10, 20, 30, 40, 50)
for (i in seq_along(keys)) assign(keys[i], values[i], envir = store)
# Retrieve
cat('key_3 =', get('key_3', envir = store), '\n')
cat('All keys:', ls(store), '\n')

環境のコピーと共有

環境を新しい変数に代入しても、環境はコピーされません。両方の変数が同じオブジェクトを参照します。独立した環境が必要な場合は、as.list() の後に list2env() を使って、本当のコピーを作成してください。

e1 <- new.env(parent = emptyenv())
e1$val <- 100
e2 <- e1          # reference, not a copy
e2$val <- 999
cat('e1$val:', e1$val, '\n')  # 999, modified via e2!

# True copy:
e3 <- list2env(as.list(e1), parent = emptyenv())
e3$val <- 0
cat('e1$val after e3 change:', e1$val, '\n')  # still 999

クイックチェック

親環境を検索せずに、名前が環境内に束縛されているかどうかを確認する関数はどれですか。

環境の作成:重要なポイント

環境の作成と調査に関する重要なポイント:

  • new.env(parent=e) は新しい空の環境を作成します。大規模な格納領域には hash=TRUE を指定します
  • assign('x', v, envir=e) と get('x', envir=e) でプログラムからアクセスします
  • e$x と e[['x']] はリストのアクセサーと同じように使えます
  • ls(envir=e) で名前を一覧表示し、exists('x', envir=e, inherits=FALSE) で厳密に確認します
  • as.list(e) でリストに変換し、list2env() で再構築します
  • 環境は参照オブジェクトです。代入するとコピーではなく共有されます
config <- new.env(hash = TRUE, parent = emptyenv())
assign('host', 'localhost', envir = config)
assign('port', 5432L,       envir = config)
assign('db',   'mydb',      envir = config)
cat('Keys  :', ls(config), '\n')
cat('host  :', config$host, '\n')
cat('port  :', config$port, '\n')

よくある質問

「Environmentの作成と確認」レッスンは無料ですか?

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

「Environmentの作成と確認」で何を学びますか?

new.env()、environment()、ls()、get()を使ってEnvironmentを操作します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

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

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

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

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

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

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