#  [R] 함수, 사용자 정의 함수

## 함수

---

- 함수는 어떤 값 x를 입력받아 정해진 계산을 수행한 후 그 결과값을 돌려주는 장치

```javascript
y <- sqrt(100) # 제곱근을 구하여 저장
y
```

**함수의 매개변수 (parameter)**

- 프로그래밍에서 함수의 입력값을 받는 변수를 **매개변수(parameter)라** 함

- 함수의 정의에 맞추어 매개변수를 입력하면 정의된 결과값을 얻을 수 있음

```javascript
d <- c(1, 7, 4, 2, 3)
sort(d) # 오름차순
sort(d, decreasing=TRUE) # 내림차순
```

- `decreasing=FALSE`와 같이 `매개변수명=매개변수값`의 형태로 입력

- 매개 변수는 **필수 매개변수**와 **선택적 매개변수**로 구분

    - **필수 매개변수**: sort() 함수에서 매개 변수 x와 같이 반드시 입력

    - **선택적 매개변수**: 사용자가 생략할 경우를 대비하여 미리 어떤 값**(기본값, default value)**을 지정

### 내장 함수

- 별도의 패키지를 설치하지 않고 사용할 수 있는 함수는 **내장 함수**라고 한다.

- R을 설치하면 기본으로 포함되어 있어 별도의 구분 작성 없이 바로 호출할 수 있다.

**paste()**

- 여러 개의 문자열이나 숫자값을 결합하여 하나의 문자열로 만드는 기능

```javascript
# 1. paste)의 기본적인 사용법
str <- paste('good', 'morning', sep=' / ') # /를 기준으로 문자열 결합

# 2. 변수 a,b, c를 paste()함수로 연결하여 출력
a <- '나의 나이는'
b <- 20
c <- '입니다'
paste(a, b, c, sep=' ')
# [1] "나의 나이는 20 입니다"

# 3. a, b연결, 새로운 벡터에 저장
a <- 1:12
b <- '월'
c <- paste(a, b, sep='')
c

# [1] "1월"  "2월"  "3월"  "4월"  "5월"  "6월"  "7월" 
# [8] "8월"  "9월"  "10월" "11월" "12월"
```

### 사용자 정의 함수

- 사용자가 스스로 만드는 함수

- 여러 이 반복될 때 함수를 생성하면 자동화할 때 유용하다.

```javascript
함수명 <- function(매개변수 목록){
    실행할 명령문(들)
    return(함수의 실행 결과)
}
```

- **함수명**: 사용자 정의 함수의 이름으로 사용자가 만들 수 있다.

- **매개변수 목록**: 함수에 입력할 매개변수 이름을 지정한다.

- **실행할 명령문(들)**: 함수에서 처리하고 싶은 내용을 작성한다.

- **함수의 실행 결과**: 함수의 실행 결과를 반환하며, 반환 결과가 없으면 return() 함수를 생략한다.

    - 함수가 구현한 값을 인자에 반환하여 변수에 저장하기 위해서는 return() 함수가 반드시 필요하다.

**매개 변수 기본값 설정**

```javascript
# 7-15
mydiv <- function(x, y=2){ # y의 기본값을 2로 설정
  result <- x/y
  return(result)
}
mydiv(x=10, y=3)
mydiv(10, 3)
mydiv(10)
```

**여러 개의 값을 반환**

- list() 함수를 이용하여 여러 개의 결과값을 하나로 묶고 이것을 반환

```javascript
# 7-16
myfunc <- function(x, y){
  val.sum <- x+y
  val.mul <- x*y
  return (list(sum=val.sum, mul=val.mul))
}

result <- myfunc(5, 8)
s <- result$sum
m <- result$mul
cat('5+8 = ', s, '\n')
cat('5*8 = ', m, '\n')
```

**사용자 정의 함수의 저장과 재실행**

```javascript
mydiv <- function(x, y=2){
    result <- x/y
    return(result)
}
```

```javascript
# 7-17
setwd('C:\\Windows')
source("myfunc.R")
```

For the site tree, see the [root Markdown](https://slashpage.com/yerim-devnote.md).
