Menu
Coddy logo textTech

상태를 가진 클로저

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
challenge icon

챌린지

쉬움

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 = "")
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

논리와 흐름의 모든 레슨

직접 연습해 보세요: 온라인 R 컴파일러