1. R의 특징
- 데이터 다루는 방법
- R에서는 전체 데이터를 한 번에 다루는 벡터 연산을 더 자주 사용
- 개별 데이터를 하나하나 처리하는 방법에 비해 속도 빠름
- 결측치 NA
- 초기화되지 않은 변수에 저장하는 NULL 외에도 관측 또는 기록되지 않은 데이터를 표시하기 위함
- 객체의 불변성
- 대부분의 R 객체는 그 값을 수정할 수 없음
- 수정되고 있다고 보이는 코드도 실제로는 새로운 객체를 생성하는 것
흐름 제어
조건문
- if 문법
- ifelse() 함수 - TRUE, FALSE 데이터 한 번에 처리할 때 사용
ifelse(c(6,7,8,9,10) %% 2 == 1 , "홀수", "짝수")
반복문
- 문법
- break : 반복문 종료
- next : 현재 수행 중인 반복문 블록의 수행을 중단하고 다음 반복 시작
for(a in 11:20){
print(a)
}
a <- 1
while(a <= 10){
print(a)
a<- a +1
}
while 문에서 next 사용
i <- 0
while(i <= 15){
i <- i+1
if(i %% 3 != 0){
next # print()문을 실행하지 않고 while문의 처음으로 감
}
print(i)
}
3. 연산
수치연산
벡터연산
- 벡터연산은 벡터 또는 리스트를 한 번에 연산하는 것을 의미
- 벡터 간의 연산도 가능.
- 벡터 연산시 개수가 다를 경우 경고 발생
- 남은 변수는 길이가 더 짧은 벡터의 앞부터 다시 연산함.
a <- c(1,2,3,4,5)
a+2
[1] 3 4 5 6 7
NA의 처리
- 데이터에 NA 포함된 경우, 결과가 항상 NA로 변경됨
- 따라서 NA (Not Available) 처리 함수 필요
- NA는 누락 된 값 지시자를 포함하는 길이 1의 논리 상수
sum(c(1,2,3,NA))
sum(c(1,2,3,NA), na.rm= T)
a <- data.frame(x=c(1,2,3),y=c("x",NA,"z"),z=c(1,2,NA))
a
na.omit(a) # NA의 포함된 행 제외
na.pass(a) # NA의 포함여부 상관하지 않음
na.fail(a) # NA가 포함되어 있을 경우 에러 반환
NA가 포함되어 있을 때 계산
- 연산하는 값들이 NA 처리된다.
4. 함수의 정의
기본정의
- 함수의 사용은 코드의 반복을 줄이거나 코드의 가독성을 높임
fibo <- function(x){
if (x==3 || x ==4){
return(1)
}
return(fibo(x-3)+fibo(x-4))
}
fibo(3)
fibo(7)
- 인자의 위치에 맞춰서 값을 넘겨주는 방식 가능
- 인자의 이름을 지정해서 넘겨주는 방식 가능
f <- function(a,b){
print(a)
print(b)
}
f(3,4)
f(b=3,a=4)
가변길이 인자
- ``` 은 개수를 알 수 없는 임의의 인자를 표현하는 데 사용
- 내부에서 호출하는 다른 함수에 넘겨줄 인자 표시
f <- function(b, ...){
print(b)
print(...)
}
f(2,3,4)
중첩 함수
- 함수 안에 또 다른 함수 정의
- 간결한 코드의 표현 가능
f <- function(a,b {
print(a)
y <- function(b){
print(b)
}
y(b)
}
f(2,3)
5. 스코프
- 코드에서 기술한 이름(변수명)이 어디에 사용 가능한지를 정하는 규칙
- 문법적 스코프(정적) 사용
- 변수가 정의된 블록 내부에서만 변수를 접근
- < < - 전역변수에 할당
y <- 1
f <- function(){
x <- 3
a <- function(){
x << - 3
y << - 3
print(x)
print(y)
}
a()
print(x)
print(y)
}
f()
y <- 1
f <- function(){
x <- 2
a <- function(){
x << - 3
y << - 3
print(x)
print(y)
}
a()
print(x)
print(y)
}
f()
- 전역변수 : 어떤 변수 영역 내에서도 접근할 수 있는 변수
- 지역변수 : 함수 내에서 정의되고 사용할 수 있는 변수
- 매개변수 : 함수의 인수로부터 받아서 생기는 변수
6. 값에 의한 전달
- R에서는 모든 것이 객체
- 객체는 함수 호출 시 일반적으로 값으로 전달
- 객체가 복사되어 함수로 전달
7. 객체의 불변성
- R의 객체는 (거의 대부분의 경우에) 불변
- 수정이 불가능함
- 객체의 값을 바꾸면, 새로운 객체가 만들어짐
x <- list()
x$y <- c(1,2,3) #실제로 x 객체를 변경하는 것이 아님
- 리스트 x에 새로운 필드 y를 만들고 값 1,2,3 할당이 아님
- x를 복사한 다음에 새로운 객체 x를 만들고, 이 x에 필드 추가하여 값을 채우고 변수명 x가 x를 가리킴
8. 모듈패턴
- 모듈이란 외부에서 접근할 수 없는 데이터와 그 데이터를 제어하기 위한 함수로 구성된 구조물
- 장점
- 데이터를 외부에서 직접 접근 불가
- 사전에 정의된 함수로만 다룰 수 있음.
- 함수의 내부구조나 데이터 구조를 마음대로 바꿀 수 있음
큐
- FIFO 방식의 자료구조
- 여러 값이 있을 때 제일 앞의 값이 처리되고 새로 입력된 값은 맨뒤에서 기다리는 구조
- Enqueue : 줄의 맨 뒤에 데이터 추가
- Dequeue : 줄의 맨 앞에 데이터 가져옴
- Size : 줄의 길이
큐 모듈작성
큐모듈 사용
- queue() 함수 호출 시 만들어지는 queue() 내부의 지역변수 que와 que_size가 생성되는 공간은 queue() 함수를 호출할 때마다 매번 새로 생성
- queue()를 여러 개 만들어 사용해도 데이터가 섞이지 않음.
'R 프로그래밍' 카테고리의 다른 글
2. 변수, 자료형 (0) | 2023.04.17 |
---|---|
1. R 환경설정 및 기초 문법 (0) | 2023.04.17 |