티스토리 뷰

방송대/R 컴퓨팅

8강. R 함수 만들기

monimoni 2025. 4. 11. 20:05

1. 함수의 정의

  • 함수( function )란 특정한 작업을 독립적으로 수행하는 프로그램 코드의 집합체
  • R의 내장함수에 사용자가 원하는 특정한 기능이 구현되어 있지 않다면 사용자 스스로 직접 함수를 생성하여 원하는 기능을 수행할 수 있음

2. 함수의 장점

  • 작업을 작은 단위로 분할하여 수행하도록 함으로써 효율성 제고
  • 자유로운 수정·보완이 가능하므로 작업의 유연성이 확보됨
  • 작업에 사용하는 코드의 오류 등의 발생 원인 파악이 용이
  • 코드의 크기를 줄임으로써 작업 프로세스 이해가 용이
  • 사용자가 정의한 함수를 자유롭게 활용하여 작업 목적을 충족

3. 함수의 구조

  • 함수의 일반적인 구조는 다음과 같음
    • 함수이름 ← function(매개변수) {함수의 몸체}
  • function은 함수를 정의를 위해 사용하는 R의 내장 함수
    • list()함수가 list 클래스 객체를 생성하듯이 function()이 함수 클래스 객체를 생성
  • 함수는 매개변수와 몸체부분으로 나눌 수 있음
    • 매개변수라는 것은 일반적으로 함수 선언부나 정의 부분에 있는 변수를 의미
    • 중괄호로 묶여 있는 함수의 몸체 부분은 함수가 호출될 때 실행하게 될 내용들
  • 함수의 수행단계
    • 입력단계에서는 매개변수를 통해 입력된 자료값을 읽어 들이는 작업을 수행
    • 연산단계에서는 입력 데이터를 변환하거나 계산하는 작업을 실시
    • 출력단계에서는 연산결과를 객체로 반환하거나 화면에 출력하는 작업

4. 변수의 종류 (*)

  • C 등과 같은 프로그래밍 언어와 마찬가지로 R에서도 변수의 유효범위에 따라 지역변수, 전역변수, 매개변수( 인수 ) 등으로 변수를 구분
    • 전역변수( global )
      • 어떤 변수의 영역 내에서도 접근할 수 있는 변수로서 프로그램이 종료될 때까지 사용 가능한 상태로 존재하다가 프로그램이 종료되면 소멸
    • 지역변수( local )
      • 전역변수와는 다르게 함수 내부에서만 사용이 가능한 변수로서 함수 내에서 정의된 후 함수가 호출되면 생성되었다가 함수가 종료되면 함께 소멸이 되는 변수
    • 매개변수
      • 함수로 전달되는 값으로 함수를 생성할 때 소괄호 내에 선언해 주며 함수 내에서만 사용 가능
  • 지역변수가 전역변수와 동일한 이름을 갖고 있을 경우에는 함수 내에서 지역변수처럼 인식이 되지만, 함수를 벗어나서는 전역변수 값이 그대로 보존되고 함수 내에서의 연산이 영향을 미치지 않음
  • 예시
> u <- 1 # 전역변수
> v <- 8 # 전역변수
> g <- function(x) { # x : 매개변수
+ x <- x + 1
+ u <- u + x # u는 지역변수의 역할
+ return(u)
+ }
> g(v) # v에 8이라는 값이 할당되어 있으므로 g(8)의 의미
[1] 10
> u # 전역변수는 값의 변화가 없음
[1] 1
> v # 전역변수는 값의 변화가 없음
[1] 8

5. 함수의 생성 방법

  • R에서 함수를 생성하는 방법은 크게 세 가지로 나뉨
    • R 콘솔에서 직접 입력하여 생성하는 방법과 fix 함수를 이용하는 방법, 그리고 외부파일에 저장하여 읽어 들이는 방법
  • R 콘솔에서 직접 입력하는 방법
> d.mean<-function(data) { # 함수의 선언
+ sum(data) / length(data) # 매개변수 값으로 들어온 data의 합을 data의
+ # 크기로 나누기
+ }

# rnorm : 정규분포를 따르는 난수를 생성
> x<-rnorm(100, mean=3, sd=1.5) # 평균이 3이고 표준편차가 1.5인

# 정규분포에서 100개의 샘플을 추출
> d.mean(x) # x의 평균을 구하는 함수
[1] 2.794839

> x<-rnorm(1000, mean=3, sd=1.5) # 1000개의 샘플을 추출
> d.mean(x)
[1] 2.960639

> x<-rnorm(10000, mean=3, sd=1.5) # 10000개의 샘플을 추출
> d.mean(x)
[1] 2.995352
  • fix() 함수 이용하는 방법
> fix(d.var)
# 창 열림
> d.var
function (data) # 함수의 선언
+ {
+ data.var <- sum((data - d.mean(data))^2) / (length(data)-1) # 분산공식
+ return(data.var) # data.var 값을 반환
+ }

# 함수 수정
> fix(d.var)
  • 외부파일에 저장하여 읽어 들이는 방법
    • 메모장을 열어서 다음과 같이 입력하고 rangefunction.txt로 저장
> d.range <- function(data) # 함수의 선언
+ {
+ data.min<-min(data) # 데이터의 최솟값 산출
+ data.max<-max(data) # 데이터의 최댓값 산출
+ c(data.min, data.max) # 데이터의 범위를 출력
+ }
> source(“c:/data/rangefunction.txt") # 함수의 호출
> d.range(x) # 예제 5-2에서 생성하였던 x의 범위 출력

6. 함수의 편집

  • 경우에 따라 생성한 함수가 오류가 있다든지 작업을 효율적으로 수행하기 위해서 함수를 편집할 필요
    • fix() 함수나 edit() 함수를 사용하면 편집창이 열리게 되므로 이를 이용하여 함수를 편집

7. 함수의 저장 예시

  • 예시 1
> f1 <- function(x,y) {return(x+y)}
> f2 <- function(x,y) {return(x-y)}

> f <- f1 # f1을 f라는 이름으로 저장
> f(1,2)
[1] 3

> f <- f2 # f2를 f라는 이름으로 저장
> f(1,2)
[1] -1
  • 예시 2 ( 함수를 실행시키는 함수 )
> g <- function(h,x,y) {h(x,y)} # h는 함수를 받는 매개변수

> g(f1,1,2) # h는 f1, x=1, y=2 ( f1(x,y) )
[1] 3

> g(f2,1,2) # h는 f2, x=1, y=2 ( f2(x,y) )
[1] -1
  • 예시 3 ( 매개변수가 없는 함수 )
> f0<-function() { # 매개변수가 없는 함수 선언
+ x<-c(1,2,3,4)
+ y<-c(4,3,2,1)
+ z<- x - y
+ print(z) # z를 출력
+ }

> f0()
[1] -3 -1 1 3
  • 예시 4 ( 매개변수 기본값 지정 )
> f_default<-function(data, num=1) { # “num=1”은 기본 값으로 1
+ d.min<-min(data)
+ d.max<-max(data)
+ switch(num, mean(data), var(data), c(d.min, d.max)) # switch 함수
+ }

8. 함수를 위한 함수

  • is.function()
    • 객체가 함수인지 아닌지 검증하는 함수
    • 지정한 객체가 함수라고 판단되면 TRUE값을, 함수가 아니면 FALSE값을 반환
  • args()
    • args() 함수는 함수의 매개변수들을 반환하는 함수
  • attributes()
    • 함수의 소스코드를 반환하는 역할을 하는 함수
    • R에서 사용자가 직접 생성한 함수가 인식이 되었다면 그 소스를 attributes() 함수를 통해 확인해 볼 수 있음

9. 연산자의 생성

  • 사용자의 정의에 따라 연산자를 생성하고 싶다면 %로 시작과 끝을 이루는 함수명을 갖는 함수를 생성
  • 주의점
    • 연산자 생성 시 반드시 인용부호와 % 표시를 병기해야 함
  • 예시
    • 두 변수 값을 받아서 앞의 값에 2를 곱한 뒤 뒤쪽 값을 더하는 연산자를 생성
> "%a2b%" <- function(a,b) return(2*a+b)
> 3 %a2b% 5
[1] 11

10. 함수 내에서의 함수 생성

  • 함수는 객체이므로 함수 내에서 다른 함수를 정의할 수 있음
> f <- function(x) {
+ v <- 2
+ g <- function(y) return((u+v+y)^2) # 함수 내에서 함수를 정의
+ gu <- g(u)
+ print(gu)
+ }

> u <- 5

> f()
[1] 144
728x90

'방송대 > R 컴퓨팅' 카테고리의 다른 글

9강. R 그래픽스I (1)  (0) 2025.04.17
7강. R 프로그래밍의 기초 (2)  (0) 2025.04.11
6강. R 프로그래밍의 기초 (1)  (0) 2025.04.10
5강. 데이터 구조 (2)  (0) 2025.03.23
4강. 데이터 구조 (1)  (0) 2025.03.15
댓글
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
최근에 올라온 글
Total
Today
Yesterday
공지사항