작성자: admin 작성일시: 2016-09-17 15:02:15 조회수: 115 다운로드: 20
카테고리: R 태그목록:

R 함수 기초 2

지역 변수

함수에 넣은 입력 변수나 함수 안에서 만들어진 변수는 함수 바깥에서는 사용할 수 없다. 혹시 이름이 같은 변수가 있다고 하더라도 별개의 변수가 된다.

따라서 함수 안에서 만들어지고 사용되는 함수를 지역 변수, 영어로 local variable 이라고 한다.

실제로 확인해 보자. 일단 함수 바깥에 혹시라도 y라는 변수가 있으면 del 명령으로 지운다.

In [1]:
rm(y)
Warning message in rm(y):
“object 'y' not found”

기존에 y라는 변수가 없었으면 그런 변수가 없다는 오류가 나온다. 만약 기존에 y라는 변수가 있었으면 오류가 출력되지 않고 지워지기만 한다

ls 명령을 사용하면 특정한 이름을 가진 변수가 있는지 알 수 있다.

In [2]:
ls(y)
Warning message in ls(y):
“‘y’ converted to character string”
Error in as.environment(pos): no item called "y" on the search list
Traceback:

1. ls(y)

이제 다음과 같이 a라는 이름의 지역 변수를 가지는 함수를 만들고 실행시킨다.

In [3]:
f <- function(x) {
    y = 10 * x
    cat("y =", y)
    return(y)
}
In [4]:
f(10)
y = 100
100

y라는 변수가 생겨났는지 ls 명령으로 다시 확인한다.

In [5]:
ls(y)
Warning message in ls(y):
“‘y’ converted to character string”
Error in as.environment(pos): no item called "y" on the search list
Traceback:

1. ls(y)

함수 안에서 만든 y라는 변수는 함수 밖에는 생성되지 않았다.

이번에는 함수 바깥에서 y라는 변수를 사용해 보자.

In [6]:
y <- 1000
In [7]:
y
1000

이제 함수를 실행시킨다.

In [8]:
f(1)
y = 10
10

다시 바깥에서 y값을 확인하면 이전과 같다.

In [9]:
y
1000

즉, 함수 안에서 만들어지는 지역 변수는 함수 바깥에 아무런 영향을 주지 않는다.

연습 문제 1

10개의 숫자를 입력하면 "그 숫자들의 합"과 "그 숫자들을 제곱한 숫자들의 합"의 차이를 계산하는 함수 diffsum를 만든다.

전역 변수

하지만 지역 변수와 반대로 함수 바깥에서 만들어진 변수는 함수 안에서 사용할 수 있다.

In [10]:
z <- 3

f2 <- function(x) {
    y <- z * x
    cat("y =", y, "\n")
    cat("z =", z)
    return(y)
}
In [11]:
f2(10)
y = 30 
z = 3
30

다만 이 때 바깥의 변수와 같은 이름의 변수를 함수 안에 만들면 안된다.

만약 바깥의 변수와 같은 이름의 변수를 함수 안에 다시 만들면 함수 안에서는 그 지역 변수를 사용하다가 함수 바깥으로 나오면 지역 변수는 사라지고 원래의 변수값으로 되돌아 온다.

따라서, 함수 안에서는 함수 바깥에 있는 변수의 값을 바꿀 수 없다.

In [12]:
z <- 3

f3 <- function(x) {
    z <- 99
    y <- z * x
    cat("y =", y, "\n")
    cat("z =", z)
    return(y)
}
In [13]:
f3(10)
y = 990 
z = 99
990

함수 바깥에서는 z가 여전히 3이다.

In [14]:
z
3

만약 함수안에서 함수 바깥에 있는 변수의 값을 꼭 바꿔야만 한다면 다음과 같이 <- 연산자가 아니라 <<- 연산자를 사용해야 한다.

In [15]:
z = 3

f4 <- function(x) {
    z <<- 99
    y <- z * x
    cat("y =", y, "\n")
    cat("z =", z)
    return(y)
}
In [16]:
f4(10)
y = 990 
z = 99
990
In [17]:
z
99

함수 바깥의 z 값이 99로 바뀌어 있는 것을 확인할 수 있다.

연습 문제 2

함수 바깥에 m 이라는 변수를 만들고 그 값을 0으로 놓는다.

앞에서 만든 diffsum 함수를 고쳐서 함수를 실행할 때 마다 diffsum 함수에서 계산된 값이 원래 있던 m 보다 크면 m을 계산된 값으로 바꾸는 함수 diffsum2 를 만든다.

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!