0Pricing
R Academy · 강의

R의 환경이란 무엇인가요?

환경을 부모 포인터가 있는 이름 있는 목록으로 살펴봅니다.

R의 환경이란 무엇인가요?은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

환경이란 무엇입니까

R에서 환경은 이름이 지정된 바인딩의 모음(이름 있는 목록과 유사)과 상위 환경을 가리키는 포인터로 이루어집니다. 모든 변수는 어떤 환경에 존재합니다. 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()는 제외). 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)는 해당 환경을 반환합니다. 이 환경은 함수의 포괄 환경이며, 자유 변수를 어디에서 찾을지 결정합니다.

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() = 기본 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의 환경이란 무엇인가요?” 강의는 무료인가요?

네 — “R의 환경이란 무엇인가요?” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“R의 환경이란 무엇인가요?”에서 뭘 배우나요?

환경을 부모 포인터가 있는 이름 있는 목록으로 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“R의 환경이란 무엇인가요?” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. R의 환경이란 무엇인가요?
  2. 어휘적 스코프 규칙
  3. 전역 스코프와 지역 스코프
  4. 환경 생성 및 검사
← R Academy(으)로 돌아가기