獨斷論

통계 R 사용설명서 17 - 나만의 함수 만들기 본문

과학과 기술/R 통계

통계 R 사용설명서 17 - 나만의 함수 만들기

부르칸 2016. 5. 26. 04:30

R에서 자신만의 사용자정의 함수를 만들어 사용할수 있다.


예를들어 함수의 첫번째와 두번째 인자(argument?)에 덧셈이나 뺄셈을 할 숫자를 넣고 세번째 인자가 1이면 덧셈을 실행하고 2이면 뺄셈을 실행하는 함수를 만들고자한다고 하자.

쉽게 말해


mysum(x, y, z)라는 함수를 만들어서

  • z가 1이면 x+y를 실행해서 그 값을 돌려주고
  • z가 2이면 x-y를 실행해서 그 값을 돌려주는 함수를 작성한다는 것이다.



R에서 함수의 형식


R에서 사용되는 함수의 형식은 아래와 같다.

my_function_name <- function(arg1, arg2, ...) {

   statement1

   statement2

   ...

   return(object)

}

여기서 object는 스칼라변수든지 벡터변수든지 리스트뱐스는지 뭐든 될수가 있다.

합과 차를 구하는 위 예제에서는 단순한 스칼라변수가 될 것이다.



합과 차를 구하는 나만의 함수 작성


위 함수의 형식에 따라 나만의 함수를 작성해보자.

my_function_name은 자신이 기억하기 쉬운 함수이름으로 짓자.

합과 차를 구하는거니깐 그냥 my_sum_diff라고 하겠다. 더 좋은 것이 있다면 자신의 생각대로 하면 된다.


argument 즉 function( )있는 arg1, arg2 등은 여기서는 3개가 필요하다.  앞서 설명했듯이 이는  x와 y, 즉 합과 차를 구할 숫자변수와 합을구할지 차를 구할지 알려줄 z..


statements에는 if-else가 필요할 것이다. 세번째 argument가 1인지 2인지 그 다른 무엇인지에 따라 합을 구하거나 차를 구하거나 해야할 것이다.


맨 마지막 return( )에서는 우리가 구한 합 또는 차를 돌려주는 기능을 한다.

R Editor를 열어서 아래와 같이 작성하고


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 my_sum_diff <- function(x, y, index) {

 if(index == 1) {
    z <- x + y
 }
 else if(index == 2) {
    z <- x - y
 }
 else {
    print("index should be either 1 or 2")
    z <- NA
 }
 
 return(z)
 }


자신이 즐겨쓰는 디렉토리에 my_sum_diff.R이라고 저장하자. 보통 함수명과 파일명을 같이하면 기억하기도 편하고 좋다.

본 예제에서는 c:\temp에 저장하였다.


위 스크립트에서

1째 줄에 함수명이 my_sum_diff이고 인자 xy는 합이나 차를 구할 변수들이고 index는 합을 구하여야할지 차를 구하여야할지 알려주는 변수인데 1이면 합을 구하고 2이면 차를 구한다.

3~5번째 줄에서 if문을 이용하여 1이면 합을 구하여 그 값을 z에 넣도록 하였다.

6~9번째 줄에서 2이면 차를 구하여 그 값을 z에 넣도록 하였다.

9~12번째 줄에서 1도 아니고 2도 아니면 1과 2를 넣으라고 메세지를 보냈다. z에는 그냥 NA를 입력하였다.

14번재 줄에서 합과 차를 구한 z를 돌려보냈다.  만약 이 return이 없다면 c <- my_sum_stiff(1,2,1)를 하더라도 c에 값이 들어가지 않는다.



나만의 함수 실행


실행하는 방법은 약간 구닥다리다.

R console로 돌아가서 현재의 작업디렉토리를 위 my_sum_diff.R을 저장한 디렉토리로 간다.


1

2

3

4

5

6

7

 > getwd()
 [1] "C:/Work/R"
 > setwd("c:/temp")
 > getwd()
 [1] "c:/temp"
 > dir()
 [1] "my_sum_diff.R"


1번째 줄에서 현재 작업디렉토리가 어디인지 알려준다.

3번째 줄에서 작업디렉토리를 바꿨다.

6번재 줄에서 바꾼 작업디렉토리 c;\temp의 파일 목록을 보았다.

중요한건 윈도우에서라도 디렉토리는 리눅스처럼 슬레시(/)를 사용하여야 한다는거..


작업디렉토리가 사용자함수가 저장된 디렉토리로 바뀌었으면 아래처럼 실행한다.


1

 > source("my_sum_diff.R")


이렇게 하면 작성됐던 my_sum_diff.R이 모두 실행되게 된다.

작성한 함수를 사용하면


1

2

3

4

5

6

7

8

9

10

11

12

 > a <- 10
 > b <- 5
 > c <- my_sum_diff(a, b, 1)
 > c
 [1] 15
 > c <- my_sum_diff(a, b, 2)
 > c
 [1] 5
 > c <- my_sum_diff(a, b, 0)
 [1] "index should be either 1 or 2"
 > c <- my_sum_diff(a, b, 3)
 [1] "index should be either 1 or 2"


사용방법은 그렇게 어렵지 않다.


리스트를 돌려주는 자신만의 함수

스칼라뿐만 아니라 모든 변수형태를 돌려줄수 있다.

여기서는 리스트를 돌려주는 함수를 만들어보자.


1

2

3

4

5

6

7

8

 mystats <- function(x) {

 center <- mean(x)
 spread <- sd(x)
 result <- list(center=center, spread=spread)

 

 return(result)
 }


함수의 이름은 mystats이고 평균을 구하여 center라 이름하여 값을 넣고 표준편차를 spread라 이름하여 값을 넣고 이 두개의 변수를 result라는 리스트변수로 작성하여 돌려주었다.

역시 위 스크립트를 mystats.R이라는 이름으로 저장하자.


1

2

3

4

5

6

7

8

9

10

11

12

 > dir()
 [1] "my_sum_diff.R" "mystats.R"   
 > source("mystats.R", echo=TRUE)

 > mystats <- function(x) {
 +
 + center <- mean(x)
 + spread <- sd(x)
 +
 + result <- list(center=center, spread=spread)
 +
 + return(result)


source()명령을 실행할때 스크립트가 어떻게 생겼는지 보기를 원한다면 echo=TRUE 옵션을 넣으면 된다.


1

2

3


4

5

6

7

8

9

10

 > a <- runif(10)
 > a
  [1] 0.6312369 0.7809163 0.7172446 0.1857858 0.5806746 0.4137886 0.3274227  0.4208271 0.3656014 0.8707070
 > b.list <- mystats(a)
 > b.list
 $center
 [1] 0.5294205

 $spread
 [1] 0.2208282


b.list라면 변수에 평균이 b.list$center에 들어가고 표준편차가 b.list$spread에 들어갔다.

Comments