샤이니에서 반응성 표현식은 느긋한 평가(lazy evaluation)를 따르고, 관찰자는 조급한 평가(eager evaluation) 방법에 따라서 코드를 실행한다고 한다.
(반응성 - 값을 반환, 관찰자 - 부수효과(그래프 출력))
느긋한 평가는 값이 필요할 때까지 코드를 실행하지 않는다는 의미를 가진다. 즉 필요한 경우에 평가를 한다는 의미이다. R에서 함수의 인자 값은 기본적으로 이런 느긋한 평가에 의해서 확정된다. 반응성 표현식이 이런 느긋한 평가를 따른다는 사실은, 반응성 표현식에 포함된 어떤 반응성 값이 바뀌어도 이 반응성 표현식을 사용하는 코드가 뒤에 붙지 않으면 표현식이 실행되지 않는다는 것을 의미한다. 뒤에서 반응성 표현식을 사용하는 경우에 그 표현식들이 평가되고 값이 부여된다.
참고로 샤이니에서 반응성 표현식은 캐시 기능이 있다. 그러므로 반응성 값이 바뀌지 않은 상태에서 체인의 후단에서 반응성 표현식을 접근하면, 이 캐시된 값을 바로 전달해주기 때문에 전체 앱의 효율이 향상된다.
조급한 평가는 코드를 바로 평가한다는 의미이다. 관찰자가 조급한 평가 방법을 따른다는 말은, 이 관찰자가 사용하는 반응성 표현식이나 반응성 값들이 변경되면 지체없이 실행된다는 것을 의미한다. 지체 없이 실행되고(앞에서 설명했듯이) 이것이 부수효과를 내기 때문에 결론적으로 브라우저에 결과가 바로 표시된다.
R의 스코핑 규칙과 <<-를 사용한 할당
R에서 어떤 변수에 값을 할당할 때 <- 연산자를 사용한다. 이런 연산자는 현재의 환경에서 해당 변수에 값을 할당한다. 환경(environment)은 '객체와 값에 대한 바인딩 집합'으로 정의되며, 중요한 R 객체의 하나이다.
보통 R콘솔에서 프롬프트에서 실행되는 것들은 글로벌 환경(global environment)에서 이루어진다. 함수가 호출되면 그 함수는 자체의 실행 환경(execuation enviroment)을 만들고 그 안에서 자체의 변수와 값에 대한 바인딩을 관리한다.
R이 어떤 변수의 값을 찾아가는 과정은 렉시컬 스코핑 규칙을 따른다. 이 규칙에 따르면, 가장 먼저 현재의 일이 진행되고 있는 환경에서 변수와 그 값이 있는지 확인한다. R프롬프트에서라면 글로벌 환경에서 먼저 찾는다. 함수가 실행되는 상황이라면 이 함수의 실행 환경에서 먼저 찾는다. 만약 변수와 값에 대한 바인딩을 찾지 못하면, 이 환경에 대한 부모 환경(parent enviroment)에서 찾게 된다. R프롬프트에서 글로벌 환경에 대한 부모 환경은 마지막에 추가한 패키지 환경이 된다. 함수의 경우에는 이 함수를 호출한 환경이 된다.
<- 연산자는 현재의 환경에 객체와 값을 바인딩 시킨다. 다음 예를 보자.
> x <- 1
> fun1 <- function() {
+ x <- 2
+ x
+ }
> fun1()
[1] 2
> x
[1] 1
이 경우 fun1() 함수 안에서는 객체 x에 2가 할당되고 있는데, 이 함수를 호출한 이후에 함수 밖에 있는 x는 영향을 받지 않는다. 영향을 주기 위해서는 <<- 연산자를 사용해야 한다. 이 연산자는 함수를 호출한 환경에서 객체와 값을 바인딩 시킨다.
(참고로 이 연산자가 R 프롬프트 글로벌 환경에서 사용될 때는 <- 과 차이가 없다.)
> x <- 1
> fun2 <- function(){
+ x <<- 2
+ x
+ }
> fun2()
[1] 2
> x
[1] 2
'전공 > R프로그래밍' 카테고리의 다른 글
R프로그래밍19. 비표준 평가(non-standard evaluation)와 탈출구(escape hatch) (0) | 2019.08.08 |
---|---|
R프로그래밍 18. 표현식의 사용 (0) | 2019.08.07 |
R프로그래밍 16.R 환경 (0) | 2019.08.01 |
R프로그래밍 15. R 함수 (0) | 2019.07.31 |
R프로그래밍 14. $,[[,[ 의 차이점 (0) | 2019.07.22 |