• Q&A
  • 회원가입
  • 로그인

[basic] R - Functions (알랭 함수) - 독립변수 / 전역변수 / 전역할당연산자

38  
목차
  1. 함수 생성(= 정의)
  2. 함수 호출
  3. 독립변수(= 인수) / 매개변수
  4. 독립변수 개수
  5. 기본 매개변수 값
  6. 값 반환 - return() 함수
  7. 안긴함수 (= 중첩함수)
  8. 재귀함수
  9. 전역변수 / 지역변수
  10. 전역할당연산자

 

  • 함수는 호출될 때만 실행되는 코드 블록임.
  • 매개변수 통해서 함수에 데이터 전달 가능.
  • 함수는 실행 결과로 데이터를 반환 가능.

 

함수 생성(= 정의)

 

func_name function() {

    # 실행코드

}

 


[예제] - hz라는 이름을 갖는 함수 생성.

 

hz <- function() {

  print("Homzzang.com")

}

 


함수 호출

 

func_name() 형태로 함수 호출.

 


[예제]

 

hz <- function() {

  print("Homzzang.com")

}

hz()

 

 

독립변수(= 인수) / 매개변수

[정의]

 

독립변수 (argument)
함수로 전달되는 데이터 의미. (예) HTML, CSS, JS

 

매개변수 (parameter)
독립변수 받기 위해 함수에 정의한 자리. (예) lang



[예제]

 

homzzang <- function(lang) {

  paste(lang, "강의")

}


homzzang("HTML") # [1] "HTML 강의"

homzzang("CSS") # [1] "CSS 강의"

homzzang("JS") # [1] "JS 강의"

 

 

독립변수 개수

 

기본적으로 매개변수 개수와 독립변수 개수는 일치해야 함.

만약, 개수 다르면 에러 발생함. 

 


[예제1] (매개변수 개수 == 독립변수 개수) ∴ 에러 발생 X

 

hz <- function(site, host) {

  paste(site, host)

}


hz("홈짱닷컴", "Homzzang.com") # [1] "홈짱닷컴 Homzzang.com"

 


[예제2] - (매개변수 개수 != 독립변수 개수) ∴ 에러 발생 O

 

hz <- function(site, host) {

  paste(site, host)

}


hz("홈짱닷컴") # 에러 발생

 

 

기본 매개변수 값

 

기본적으로 매개변수 개수와 독립변수 개수는 같아야 하나,

매개변수 기본값이 정의된 경우엔 다를 수도 있음.

 


[예제1] - 1번째 매개변수에 기본값 설정된 경우

 

hz <- function(site="홈짱닷컴", host) {

  paste(site, host)

}


hz(,"Homzzang.com") # [1] "홈짱닷컴 Homzzang.com"

 

PS. 호출 시, 빨간색 쉼표( , ) 빼먹지 않도록 주의.


[예제2] - 2번째 매개변수에 기본값 설정된 경우

 

hz <- function(site, host="Homzzang.com") {

  paste(site, host)

}


hz("홈짱닷컴") # [1] "홈짱닷컴 Homzzang.com"

 


[예제3] - 모든 매개변수에 기본값이 설정된 경우

 

hz <- function(site="홈짱닷컴", host="Homzzang.com") {

  paste(site, host)

}


hz() # [1] "홈짱닷컴 Homzzang.com"

 

PS. 독립변수 없으면, 매개변수 기본값들이 출력됨.

 

 

값 반환 - return() 함수

 

return() 함수 사용하면, 출력은 안 시키고 함수 결과값만 반환 가능.

 


[예제]

 

homzzang <- function(x) {

  return (5 * x)

}


print(homzzang(1)) # [1] 5

print(homzzang(2)) # [1] 10

print(homzzang(3)) # [1] 15

 

[주의] R 언어는 값만으로 출력 가능해서, print() 함수 없이도 출력 가능.

 

안긴함수 (= 중첩함수)

※ 2가지 방법 가능.

 

 


[방법1] - 다른 함수 안에서 함수 호출

 

hz <- function(x, y) {

  a <- x + y

  return(a)

}


hz(hz(1, 1), hz(2, 2)) # [1] 6

 

PS. 해설.

  • hz(1, 1) 결과값 2가 바깥함수의 x 매개변수로 전달됨.
  • hz(2, 2) 결과값 4가 바깥함수의 y 매개변수로 전달됨. 

방법2 - 다른 함수 안에 함수 작성

 

hz_out <- function(x) {

  hz_in <- function(y) {

    a <- x + y

    return(a)

  }

  return (hz_in)

}

output <- hz_out(3)

output(4) # [1] 7

 

 

PS. 해설

  • hz_in() 함수가 안에 있어서 직접 호출 불가.
  • 따라서, hz_out() 함수를 먼저 호출해야 함.
  • output 변수 생성 후, 독립변수 3을 전달함.
  • 그 다음에 y로 독립변수 4 전달해 7이 나옴.

 

재귀함수

 

함수 자신을 함수 안에서 호출하는 경우에 해당.

 


[예제]

 

hz <- function(k) {

  if (k > 0) {

    result <- k + hz(k - 1)

    print(result)

  } else {

    result = 0

    return(result)

  }

}

hz(3)

 

결과값:

[1] 1

[1] 3

[1] 6


PS1. 재귀함수 작동원리

 

hz(3) = 3 + hz(2)

hz(2) = 2 + hz(1)

hz(1) = 1 + hz(0) = 1

hz(2) = 2 + 1 = 3

hz(3) = 3 + 3 = 6

 


PS2. 재귀함수 사용 시, 주의사항

 

  1. 무한반복 안 되도록 주의.
  2. 과도한 메모리/CPU점유율 안 차지하도록 주의.

 

∴ 충분히 테스트 후 적용 권장. 

 

PS. Java  언어의 재귀함수 강의 참고.

 

전역변수 / 지역변수

[정의]

 

전역변수

  • 함수 밖에서 선언된 변수를 의미.
  • 함수 밖과 안에서 모두 접근 가능.
  • 동일명의 지역변수 있어도 변수명과 값을 유지.

 

지역변수

  • 함수 안에서 선언된 변수를 의미.
  • 함수 안에서만 유효. (즉, 함수 밖에선 사용 불가.)

 


[예제1] - 전역변수

 

host <- "Homzzang.com"

hz <- function() {

  paste("홈짱닷컴", host)

}


hz() # [1] "홈짱닷컴 Homzzang.com"

 


[예제2] - 지역변수

 

host <- "Homzzang.com"

hz <- function() {

  host = "homzzang.com"

  paste("홈짱닷컴", host)

}


hz() # [1] "홈짱닷컴 homzzang.com"

host # Homzzang.com

 

 

전역할당연산자

 

일반적으로 함수 안에서 선언된 변수는 지역변수라서 함수 안에서만 유효.

하지만, 함수 안에서도 전역할당연산자 <<-  이용해 전역변수 생성 가능.

※ 전역할당연산자 사용하면 함수 안에서 전역변수 변경도 가능. (예제2)

 


[예제1] - 함수 안에서 전역변수 선언하기

 

hz <- function() {

  host <<- "Homzzang.com"

  paste("홈짱닷컴", host)

}


hz() # [1] "홈짱닷컴 Homzzang.com"

print(host) # [1] "Homzzang.com"

 


[예제2] - 함수 안 전역변수로 함수 밖 전역변수 변경 가능

 

host <- "homzzang.com"

hz <- function() {

  host <<- "Homzzang.com"

  paste("홈짱닷컴", host)

}


hz() # [1] "홈짱닷컴 Homzzang.com"

paste("홈장닷컴", host) # [1] "홈장닷컴 Homzzang.com"

 



찾아주셔서 감사합니다. Since 2012