조건문
조건문은 일반 다른 언어들과 같다.
if, else if, else로 이루어진다.
x <- 10
> if(x > 1){
+ print("x is greater than 1")
+ }else{
+ print("x is less than 1")
+ }
[1] "x is greater than 1"
삼항연산자처럼 쓰이는 코드는 ifelse이다.
iselse(조건, 참일때, 거짓일때)
> ifelse(x > 1, "x is greater than 1", "x is less than 1")
[1] "x is greater than 1"
반복문
for문은 파이썬과 비슷하다.
x <- 1:5
> for(i in x){
+ print(i)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
x <- 1:10
for(i in x){
+ ifelse(i > 5, print("x is greater than 5"), print("x is less than 5"))
+ }
[1] "x is less than 5"
[1] "x is less than 5"
[1] "x is less than 5"
[1] "x is less than 5"
[1] "x is less than 5"
[1] "x is greater than 5"
[1] "x is greater than 5"
[1] "x is greater than 5"
[1] "x is greater than 5"
[1] "x is greater than 5"
x <- c("aA","bb","cCC","dddd")
for(i in 1:4){
+ print(x[i])
+ }
[1] "aA"
[1] "bb"
[1] "cCC"
[1] "dddd"
> for(i in 1:length(x)){
+ print(x[i])
+ }
[1] "aA"
[1] "bb"
[1] "cCC"
[1] "dddd"
> for(i in seq(x)){
+ print(x[i])
+ }
[1] "aA"
[1] "bb"
[1] "cCC"
[1] "dddd"
seq의 의미는 x의 크기만큼 벡터 시퀸스를 생성해준다.(여기선 1:4)
matrix for문을 돌리는 법은 아래와 같다.
m <- matrix(1:10, 2)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> for(i in seq(nrow(m))){
+ for(j in seq(ncol(m))){
+ print(m[i,j])
+ }
+ }
[1] 1
[1] 3
[1] 5
[1] 7
[1] 9
[1] 2
[1] 4
[1] 6
[1] 8
[1] 10
while문 또한 다른 언어와 동일하니 생략하도록 한다.
i <- 1
> while (i < 10) {
+ print(i)
+ i <- i + 5
+ }
[1] 1
[1] 6
>
repeat문은 while(1)과 동일하고 탈출조건은 break로 한다.
a <- 1
> repeat {
+ print(a)
+ a <- a+1
+ if(a > 4)
+ break
+ }
[1] 1
[1] 2
[1] 3
[1] 4
이제 r언어에서는 continue가 없다.
따라서 next라는 구문을 이용한다.
> x <- -5:10
> for(i in x){
+ if(i <= 2){
+ next
+ }
+ print(i)
+ }
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
함수
R언어는 함수를 선언된 벡터에도 선언 할 수 있다.
이처럼 R언어는 매우 유연하여 어느곳에서 뭐든 이용 할 수 있다.
함수 선언은 아래와 같이 한다.
> vc <- c("hello","crocus","this","is","kkw")
> vc.getName <- function(x){
+ for(i in x){
+ print(i)
+ }
+ }
아래와 같이 하면 인자를 보냈지 않았기에 오류가 난다.
> vc.getName()
Error in vc.getName() : argument "x" is missing, with no default
> vc.getName(vc)
[1] "hello"
[1] "crocus"
[1] "this"
[1] "is"
[1] "kkw"
이를 이용하여 R에서 재귀 피보나치를 만들어보자.
> fibo <- function(x){
+ if(x == 0)
+ return (0)
+ else if(x == 1)
+ return (1)
+ return (fibo(x - 1) + fibo(x - 2))
+ }
> for(i in 1:10)
+ print(paste("i :: ", i, " fibo :: ", fibo(i)))
[1] "i :: 1 fibo :: 1"
[1] "i :: 2 fibo :: 1"
[1] "i :: 3 fibo :: 2"
[1] "i :: 4 fibo :: 3"
[1] "i :: 5 fibo :: 5"
[1] "i :: 6 fibo :: 8"
[1] "i :: 7 fibo :: 13"
[1] "i :: 8 fibo :: 21"
[1] "i :: 9 fibo :: 34"
[1] "i :: 10 fibo :: 55"
sapply 함수는 내장 함수이며 몇가지 추가적인 함수는 아래 링크에서 참조해보자.
lapply :: 리스트형태의 apply
sapply :: 벡터형태의 apply
https://dic1224.blog.me/80207631285
> plus <- function(x,y) x + y
> sapply(1:10, plus, 3)
[1] 4 5 6 7 8 9 10 11 12 13
> sapply(1:10, `+`, 3)
[1] 4 5 6 7 8 9 10 11 12 13
> sapply(1:10, '+', 3)
[1] 4 5 6 7 8 9 10 11 12 13
> sapply(1:10, "+", 3)
[1] 4 5 6 7 8 9 10 11 12 13
r언어에서 paste로 문자열을 붙여야하지만 %+% 메서드를 이용할 수도 있다.
> paste("new","string")
[1] "new string"
> `%+%`("new","string")
[1] "new string"
> "new" %+% "string"
[1] "new string"
문제 생각해보기
> x <- 5
> f <- function(){
+ y <- 10
+ return (c(x = x, y = y))
+ }
>
> f()
일때 리턴되는 결과는 어떻게 될까?정답은 x는 바로 위의 값을 참조하고 y는 현재 지역변수 값을 참조한다.
따라서 아래와 같이 정답이 나타난다.
x y
5 10
> x <- 5
> g <- function() {
+ x <- 20
+ y <- 10
+ return (c(x = x, y = y))
+ }
> g()
이때는 x가 지역변수 y가 지역변수이기에 리턴 값은 아래와 같다.
x y
20 10
apply
루프를 만들어 주는 함수
> x <- matrix(1:12, ncol = 4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> apply(x,1,max)
[1] 10 11 12
> apply(x,1,min)
[1] 1 2 3
> apply(x,1,max)
[1] 10 11 12
> apply(x,1,mean)
[1] 5.5 6.5 7.5
---
apply(x,1,mean)에서 1은 행 단위로 loop를 돌아줌을 의미하고
아래의 apply(,2,)에서 2는 열 단위로 loop를 돌아줌을 의미한다.
---
> x <- matrix(1:12, ncol = 4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> apply(x,2,max)
[1] 3 6 9 12
> apply(x,2,min)
[1] 1 4 7 10
> apply(x,2,mean)
[1] 2 5 8 11
'Basic > R' 카테고리의 다른 글
R언어 예제를 통한 몇가지 정리 (0) | 2018.05.25 |
---|---|
R언어를 이용한 평균, 분산, 표준편차 (0) | 2018.05.14 |
R언어 Matrix, Array, Data frame (0) | 2018.04.05 |
Data Types, Lists, Attribute, name 함수 (0) | 2018.04.03 |
R언어 list, attr, names, dim, factor, table (2) | 2018.03.23 |