전역 스코프와 지역 스코프
.GlobalEnv, 함수 환경, 클로저의 차이를 이해합니다.
전역 스코프와 지역 스코프은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
함수의 지역 변수
함수 본문 안에서 <- 또는 =로 할당한 변수는 해당 함수에 지역적입니다. 이러한 변수는 함수 자체의 환경에 만들어지고 함수가 반환되면 사라집니다. 호출 범위에는 영향을 주지 않습니다.
x <- 'global'
f <- function() {
x <- 'local' # creates a new local binding, does not modify global x
cat('Inside f: x =', x, '\n')
}
f()
cat('Outside f: x =', x, '\n') # still 'global'함수 매개변수는 지역 변수입니다
함수 매개변수도 지역 변수입니다. 함수 내부에서 매개변수를 수정해도 호출 환경의 인수에는 영향을 주지 않습니다. R은 값으로 인수를 전달하며, 수정할 때 복사하는 방식으로 동작합니다.
double_it <- function(n) {
n <- n * 2 # modifies local copy only
cat('Inside:', n, '\n')
}
my_n <- 5
double_it(my_n)
cat('Outside:', my_n, '\n') # still 5전역 할당을 위한 <<-
<<-(상위 할당)는 부모 연결을 따라 올라가며 처음으로 일치하는 바인딩에 할당합니다. 어디에서도 일치하는 항목을 찾지 못하면 전역 환경에 바인딩을 만듭니다. <<-를 지나치게 사용하면 함수의 동작을 파악하기 어려워지므로 신중하게 사용하십시오.
total <- 0
add_to_total <- function(x) {
total <<- total + x
}
add_to_total(10)
add_to_total(25)
add_to_total(5)
cat('Total:', total, '\n')<<-는 연결을 따라 올라가며 검색합니다
<<-는 무조건 전역 환경에 할당하지 않습니다. 부모 연결을 따라 올라가며 이름이 이미 존재하는 첫 번째 환경에 할당합니다. 변수가 바깥 함수에 존재하면 해당 환경의 변수가 갱신됩니다.
outer <- function() {
n <- 0
increment <- function() n <<- n + 1
increment()
increment()
cat('n in outer:', n, '\n') # n was in outer's env, updated there
}
outer()
# n does NOT appear in global env
cat('n in global:', exists('n', envir = globalenv()), '\n')환경을 명시적으로 지정하는 assign()
assign('name', value, envir = e)는 특정 환경에 직접 할당합니다. <<-보다 명시적이며, 환경 객체를 가지고 그 안에 정확히 값을 설정하려 할 때 유용합니다.
my_env <- new.env(parent = emptyenv())
assign('score', 95, envir = my_env)
assign('name', 'Alice', envir = my_env)
cat('score:', get('score', envir = my_env), '\n')
cat('name :', get('name', envir = my_env), '\n')local() — 격리된 코드 블록
local({...})은 새로운 지역 환경에서 표현식을 평가합니다. 블록 안에서 만든 변수는 전역 환경으로 새어 나가지 않습니다. 작업 공간을 오염시키지 않아야 하는 임시 계산에 유용합니다.
result <- local({
temp1 <- 100
temp2 <- 200
temp1 + temp2 # the last expression is returned
})
cat('result:', result, '\n')
cat('temp1 in global:', exists('temp1'), '\n') # FALSE격리를 위한 local()과 함수 비교
local()과 즉시 호출 함수는 모두 범위를 격리합니다. 한 번만 사용할 격리에는 local()이 더 간결하고, 로직을 재사용하거나 테스트할 때는 이름이 있는 함수가 더 적합합니다.
# Option A: local()
result_a <- local({
x <- 7
y <- 3
x * y
})
# Option B: immediately invoked function
result_b <- (function() {
x <- 7
y <- 3
x * y
})()
cat(result_a, result_b, '\n')
cat('x in global:', exists('x'), '\n')함수에서 전역 변수 읽기
함수는 특별한 구문 없이 바깥 범위(전역 범위 포함)의 변수를 읽을 수 있습니다. 이것이 표준 어휘적 범위 지정입니다. 하지만 전역 상태에 지나치게 의존하면 함수를 테스트하기 어려워지므로, 가능하면 명시적 인수를 사용하십시오.
tax_rate <- 0.20 # global configuration
apply_tax <- function(price) {
price * (1 + tax_rate) # reads tax_rate from global
}
cat(apply_tax(100), '\n')
cat(apply_tax(250), '\n')변수 가리기
지역 변수의 이름이 전역 변수의 이름과 같으면 지역 바인딩이 전역 변수를 가립니다. 함수 내부에서는 지역 버전이 사용되고 전역 변수는 변경되지 않습니다. 의도하지 않게 사용하면 찾기 어려운 오류가 발생할 수 있습니다.
mean <- 99 # shadows base R's mean() function
cat(mean, '\n') # prints 99, not the function
# To call the real mean, use base:: prefix
cat(base::mean(c(1, 2, 3, 4, 5)), '\n')
rm(mean) # remove the shadowfunction() 환경
함수가 호출될 때마다 R은 해당 호출을 위한 새 환경을 만들고, 함수의 바깥 환경을 부모로 설정합니다. 서로 다른 호출의 지역 변수는 재귀 호출을 포함하여 서로 간섭하지 않습니다.
factorial_r <- function(n) {
# Each recursive call has its own local n
if (n <= 1) return(1)
n * factorial_r(n - 1)
}
cat('5! =', factorial_r(5), '\n')
cat('7! =', factorial_r(7), '\n')변수 제거를 위한 rm()
rm('name') 또는 rm(name)은 현재 환경(또는 지정된 환경)에서 바인딩을 제거합니다. 임시 변수를 정리할 때 사용하십시오. 특정 환경에서 제거하려면 envir = e를 전달합니다.
x <- 42
y <- 'hello'
cat('Before rm:', ls(), '\n')
rm(x)
cat('After rm(x):', exists('x'), '\n')
rm('y')
cat('After rm(y):', exists('y'), '\n')빠른 확인
<<-는 일반적인 <-와 달리 무엇을 하나요?
범위: 핵심 요점
전역 범위와 지역 범위의 핵심 요점:
- 함수 내부의
<-는 지역 변수를 만들며 전역 변수는 변경하지 않습니다 - 함수 매개변수는 지역 변수이고, R은 값을 복사하는 방식으로 전달합니다
<<-는 부모 연결을 따라 올라가며 처음 일치하는 바인딩을 수정합니다assign('x', val, envir=e)는 환경을 명시적으로 지정하여 할당합니다local({...})은 이름이 있는 함수를 만들지 않고도 임시 범위를 제공합니다- 중요한 이름(예:
mean,c,T)을 가리지 않도록 하십시오
# Demonstrate local + <<- cleanly
running_sum <- 0
local({
values <- c(10, 20, 30, 40)
for (v in values) running_sum <<- running_sum + v
})
cat('Running sum:', running_sum, '\n')
cat('values in global:', exists('values'), '\n')자주 묻는 질문
“전역 스코프와 지역 스코프” 강의는 무료인가요?
네 — “전역 스코프와 지역 스코프” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“전역 스코프와 지역 스코프”에서 뭘 배우나요?
.GlobalEnv, 함수 환경, 클로저의 차이를 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
R Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“전역 스코프와 지역 스코프” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- R의 환경이란 무엇인가요?
- 어휘적 스코프 규칙
- 전역 스코프와 지역 스코프
- 환경 생성 및 검사