DBILITY

R user defined function, variable scope ( 사용자 정의 함수와 변수의 스코프 ) 본문

statistics/R

R user defined function, variable scope ( 사용자 정의 함수와 변수의 스코프 )

DBILITY 2018. 11. 23. 23:45
반응형

함수에 대한 기초 설명은 필요 없을 듯하다.

가변 인수(...)를 설정할 수 있다는 것과 중첩 함수를 실습해 보자.

R에 내장된 datasets으로 실습해 볼 수 있다.

> f<-function(...){
+   args<-list(...)
+   for(x in args) {
+     print(paste('hello',x))
+   }
+ }
> 
> f(1,2,3,4,5)
[1] "hello 1"
[1] "hello 2"
[1] "hello 3"
[1] "hello 4"
[1] "hello 5"

#중첩함수 = 함수내에 함수를 정의하는 것
#인터프리트방식의 실행이라 먼저 선언되어 있어야 한다.
> f<-function(...){
+   
+   args<-list(...)
+   for(x in args) {
+     print(paste('f hello',x))
+   }
+   
+   g<-function(...) {
+     args<-list(...)
+     for(x in args) {
+       print(paste('g hello',x))
+     } 
+   }
+   
+   g(...)
+ }
> 
> f(1,2,3,4,5)
[1] "f hello 1"
[1] "f hello 2"
[1] "f hello 3"
[1] "f hello 4"
[1] "f hello 5"
[1] "g hello 1"
[1] "g hello 2"
[1] "g hello 3"
[1] "g hello 4"
[1] "g hello 5"

#함수가 결과값이 함수인 예제로 리턴된 함수를 변수로 할당하고 변수(함수)를 호출
> f<-function(x) {
+   return(function(y){
+     return(x+y)
+   })
+ }
> 
> r<-f(4)
> r(5)
[1] 9
#ls()함수는 선언된 변수의 목록을 출력한다.
> ls()
[1] "df" "f"  "r"  "x" 
#rm()함수는 선언된 변수를 모두 삭제한다.
> rm(list=ls())
> ls()
character(0)
#함수 내부에서 변수의 참조는 동일레벨(?)순서다.
#2번 x변수의 값 2가 출력이 먼저 되고, #1번 x변수의 값이 출력이 된다.
> f<-function(){
+   x<-1 # 1
+   g<-function() {
+     x<-2 # 2
+     print(x)
+   }
+   g()
+   print(x)
+ }
> 
> f()
[1] 2
[1] 1
#2번 변수를 1번으로 참조를 바꾸려면 <<- 할당연산자(?)를 사용하면 된다.
#설명이 좀 이상하지만, 그냥 단순하게 생각하면 되지 않을까?
> f<-function(){
+   x<-1 # 1
+   g<-function() {
+     x<<-2 # 2
+     print(x)
+   }
+   g()
+   print(x)
+ }
> 
> f()
[1] 2
[1] 2

프로그래밍 언어의 기본적인 변수의 스코프처럼 함수 외부에서 선언될 경우 전역 변수, 함수 내부에서 선언될 경우 지역변수다.

당연히도 전역변수와 지역변수가 동일할 때 지역변수가 우선한다.

중첩 함수의 경우 외부의 지역변수를 참조할 수 있다.

나는 언제 이걸 알았던 걸까? 중학생이던가... 그땐 컴퓨터도 8비트.. 허큘리스... 페르시아 왕자를 하던 친구 집에 가본 게 다였지..

10리 길을 자전거 타고 가지 않은 날은 버스를 기다리는 시간 전자오락실에서 대부분 구경만 하거나 공립도서관에 가거나 해야 했던 나... 돈이 없었다...

결국 갈곳은 학교와 버스터미널 중간의 서점.. 당시만 해도 컴퓨터는 최신의 최신의 기술(?)이었다.

이해도 되지 않는 레지스터,스태틱...그걸 뭐하러 봐서.. 이 늦은 시간에 이러고 있을까...ㅎㅎ

반응형
Comments