정전기
R6 클래스는 환경(environment)의 참조에 의한 복사(copy by reference) 동작을 활용해 객체 간에 필드를 공유할 수 있어요. 이를 설정하려면 shared라는 이름의 private 필드를 정의하세요. 이 필드는 여러 줄로 정의하며 다음을 수행해야 합니다.
- 새로운 environment를 만듭니다.
- 공유할 필드를 그 environment에 할당합니다.
- 해당 environment를 반환합니다.
공유 필드는 활성 바인딩을 통해 접근해야 해요. 이는 지금까지 보신 다른 활성 바인딩과 동일하게 동작하지만, 필드를 가져오거나 설정할 때 private$shared$ 접두사를 사용한다는 점이 다릅니다.
R6Class(
"Thing",
private = list(
shared = {
e <- new.env()
e$a_shared_field <- 123
e
}
),
active = list(
a_shared_field = function(value) {
if(missing(value)) {
private$shared$a_shared_field
} else {
private$shared$a_shared_field <- value
}
}
)
)
활성 바인딩의 이름은 가져오거나 설정하려는 공유 필드의 이름과 반드시 같아야 합니다. 위 예시에서는 둘 다 a_shared_field예요.
이 연습은 강의의 일부입니다
R에서 S3와 R6로 배우는 Object-Oriented Programming
연습 안내
MicrowaveOven 클래스의 일부가 미리 정의되어 있어요.
MicrowaveOven클래스의 private 요소에서shared라는 필드를 업데이트하세요.- 이 필드는 중괄호
{}로 감싼 세 줄의 코드여야 합니다. - 먼저
new.env()(docs)를 호출해e라는 새 environment를 만들고, 그다음… e에safety_warning라는 변수를 할당하는데, 값은"Warning. Do not try to cook metal objects."로 하세요. 그리고…- 마지막으로 그 environment를 반환하세요.
- 이 필드는 중괄호
- private로 공유되는
safety_warning필드를 가져오거나 설정하는,safety_warning라는 이름의 활성 바인딩을 추가하세요.- 이는
active요소 내부에 함수로 정의합니다. - 이 함수는
value라는 단일 인수를 받아요. private$shared$safety_warning를 가져오거나 설정하도록 구현하세요.
- 이는
- 각각
a_microwave_oven과another_microwave_oven라는 이름의MicrowaveOven객체 두 개를 생성하세요. a_microwave_oven의safety_warning필드를"Warning. If the food is too hot you may scald yourself."로 변경하세요.- 변경 사항을 확인하기 위해
another_microwave_oven의safety_warning필드를 확인하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
# Complete the class definition
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
shared = {
# Create a new environment named e
___
# Assign safety_warning into e
___
# Return e
___
}
),
active = list(
# Add the safety_warning binding
safety_warning = ___(___) {
if(___(___)) {
___
} else {
___ <- ___
}
}
)
)
# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
# Verify that the warning has change for another_microwave
___