×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 1,499,763명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)

조건문


조건문은 일반 다른 언어들과 같다.

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

루프를 만들어 주는 함수


http://issactoast.com/53


> 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