상태를 가진 클로저
Coddy R 여정의 논리와 흐름 섹션에 포함된 레슨. 64개 중 30번째.
함수 내부에서 <-는 지역 변수를 생성합니다. <<- 연산자는 대신 같은 이름을 가진 바깥쪽 함수의 변수에 값을 할당하므로, 클로저가 캡처한 값을 업데이트할 수 있습니다:
make_counter <- function() {
count <- 0
function() {
count <<- count + 1
count
}
}
next_id <- make_counter()
print(next_id())
print(next_id())
print(next_id())출력:
[1] 1
[1] 2
[1] 3메이커가 만든 각 카운터는 고유한 count를 가지므로 서로 간섭하지 않습니다:
make_counter <- function() {
count <- 0
function() {
count <<- count + 1
count
}
}
a <- make_counter()
b <- make_counter()
for (i in 1:2) a()
print(a())
print(b())출력:
[1] 3
[1] 1클로저 안에서 일반적인 <-를 사용하면, 업데이트할 때마다 호출이 끝난 후 사라지는 새로운 지역 변수가 생성되므로 저장된 값은 절대 변경되지 않습니다:
make_broken <- function() {
count <- 0
function() {
count <- count + 1
count
}
}
f <- make_broken()
for (i in 1:2) f()
print(f())출력:
[1] 1메이커는 동일한 변수를 공유하는 클로저 목록을 반환할 수 있습니다. 이들은 함께 자체 데이터를 가진 작은 객체처럼 동작합니다:
make_wallet <- function(balance) {
list(
add = function(x) balance <<- balance + x,
get = function() balance
)
}
w <- make_wallet(10)
w$add(5)
print(w$get())출력:
[1] 15챌린지
쉬움make_counter()를 완성하세요. 이 함수는 호출될 때마다 자신의 카운트에 1을 더하고 새로운 카운트를 반환하는 함수를 반환하며, 카운트는 1부터 시작합니다.
제공된 코드는 a와 b라는 두 개의 카운터를 만듭니다. 쉼표로 구분된 a와 b 목록을 읽고, 각 항목에 해당하는 카운터를 호출한 다음 반환된 각 값을 한 줄에 하나씩 출력합니다.
직접 해보기
make_counter <- function() {
# 여기에 코드를 작성하세요
function() 0
}
# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
counters <- list(a = make_counter(), b = make_counter())
for (k in strsplit(input[1], ",")[[1]]) cat(counters[[k]](), "\n", sep = "")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
논리와 흐름의 모든 레슨
직접 연습해 보세요: 온라인 R 컴파일러