본문으로 바로가기



R에서의 environment

category R Programming/Data handling 2017.05.23 21:21
오늘은 재미있는 코드를 들고왔습니다. Rcpp(http://www.rcpp.org/) 책 보다가 나온 코드인데 원래는 Stackoverflow에 올라온 코드같습니다.

피보나치 수열 계산할때 재귀식 사용하면 매번 계산할때 이전 숫자들 다시 계산해서 비효율적입니다. 그래서 예전에 한 번 계산을 했던 결과값을 저장해놓으면 함수를 다시 불러올 경우 이미 계산을 한 숫자에 대해서는 계산을 하지 않게 만들면 함수가 훨씬 빨라지게 됩니다.


 

위의 R코드에서 주목해야 할 코드가 두 개 있는데 하나는 local() 함수이고, 다른 하나는 '<<-' 변수 저장 연산자 입니다.

1. '<<-' 연산자에 대하여

먼저 '<<-' 연산자의 경우,  일반적인 변수에 값을 부여할 때 사용되는 '<-' 연산자와 달리 현재 속해있는 변수환경 하나 위에 있는 환경에 있는 변수에 값을 부여할 때에 사용됩니다. 중요한 것은 만약 하나위의 환경에 그 변수가 없을 경우, 하나 더 위의 환경으로 올라가서 같은 이름의 변수를 찾기를 반복하다가 결국 최상위 환경에도 변수가 없을 경우, 최상위 환경(Global environment)에 변수를 생성하고 값을 부여한다는 점 입니다.


위에 R코드에서는 '<<-' 연산자가 속한 환경은 함수 f 안에 이라고 생각할 수 있죠. 그렇다면 '<<-' 연산자는 현재 속한 환경인 '함수 f 안' 보다 하나 위인 함수 밖에서 mome라는 이름을 가진 변수를 찾아 값을 부여하려고 할 것 입니다. memo 변수를 우리가 함수 f를 정의 하기 전에 선언하였으므로 이미 선언된 memo변수에 값을 저장하게 됩니다.

2. local() 함수에 대하여

피보나치 함수 효율화 과정처럼 특정 변수를 함수와 연결하여 사용하고 싶은 경우, local() 함수를 이용하여 함수를 정의할 때 그에 대응되는 변수를 따로 새로운 환경을 만들어서 같이 정의해 줄 수 수 있습니다. 이렇게 생성해주면 함수와 변수가 함께 묶여다니는 효과를 누릴 수 있게 됩니다. 즉, 함수가 정의될 때 변수가 같이 선언이 되고, 함수가 최상위 환경에서 제거되면 그에 상응하는 변수 역시도 없어지게 됩니다. 다음의 코드를 실행해 보시면서 이해하시면 쉬울 것이라 생각합니다.



위의 코드에서 최상위 환경에서 정의된 변수 x의 값을 변경하여도 함수 together에 정의된 x는 계속 그 값을 유지하는 것을 볼 수 있습니다. :D


자세한 내용은 다음의 stack overflow 포스팅(https://stackoverflow.com/questions/10904124/global-and-local-variables-in-r)을 참고하시기 바랍니다.

SHARE TO



티스토리 툴바