SlideShare a Scribd company logo
2
Most read
3
Most read
5
Most read
R 프로그래밍 기초 #2 
R 프로그래밍 기본 문법 
2014.11.13 조대협 http://bcho.tistory.com
조건문과 반복문 
• 조건문 if 
if(조건){ 
.. 
}else{ 
.. 
} 
ifelse( 조건,TRUE 일때 값,FALSE 일때 값) 
ex) isEven<-ifelse(x %% 2==0, “even”, “odd); 
• 반복문 
명령 예제 설명 
for(i in data){..} 
for(i in 1:10){ 
.. 
} 
while(조건){..} 
while(i<=10){ 
.. 
} 
repeat{ 
.. 
} 
repeat{ 
.. 
} 
while(TRUE)와 동일 
break 반복문 루프를 빠져 나옴 
next 
현재 반복을 중단하고 다음 반복을 시작 
cf. 자바에서 continue;
연산 
• 수치 연산 
명령 예제 설명 
+,-,/,* 사칙연산 
n %% m 나머지 
n%/%m 몫 
n^m 제곱 
exp(n) 푒푛 
log(x,base=exp(1)) 
푙표푔푏푎푠푒(푥) 만약 base를 정하지 않으면 
푙표푔푒 (푥) 
log2(x),log10(x) 푙표푔2 푥 , 푙표푔10(푥) 
sin(x),cos(x),tan(x) 각각 삼각함수
연산 
• 벡터 연산 (Vectorized Computation) 
x<-c(1:5) 
> x 
[1] 1 2 3 4 5 
> x+1 
[1] 2 3 4 5 6 
> x+x 
[1] 2 4 6 8 10 
> sum(x) 
[1] 15 
> mean(x) 
[1] 3 
> x [1] 1 2 3 4 5 
> x == c(2:6) 
[1] FALSE FALSE FALSE FALSE FALSE 
> x == c(1,3:7) 
[1] TRUE FALSE FALSE FALSE FALSE FALSE Warning message: In x == c(1, 3:7) : longer object length is not a multiple of 
shorter object length 
> x == c(1,3:6) [1] TRUE FALSE FALSE FALSE FALSE 
> ifelse(x %%2==0,"even","odd") 
[1] "odd" "even" "odd" "even" "odd"
NA 값의 처리 
• NA : 값이 기록되지 않았거나 관측이 되지 않음 경우. “결측치”라고 함. NULL과 다름 
• 데이타에 NA가 포함되어 있으면 모든 계산 결과는 NA가 됨 
• 이를 피하기 위해서, R function에는 na.rm=TRUE라는 인자를 넘길 수 있음. (이경우 NA값을 해 
당 연산에서 제외함) 
NA&TRUE 
[1] NA 
> NA+1 
[1] NA 
> NA-1 
[1] NA 
> sum(c(1:3,NA)) 
[1] NA 
> sum(c(1:3,NA),na.rm=TRUE) 
[1] 6 
명령 예제 설명 
na.fail(object) object에 NA 가 포함되면 fail 
na.pass(object) object에 NA가 포함되어 있더라도 pass 
na.omit object에 NA가 포함되어 있으면 이를 제외 
na.exclude 
object에 NA가 포함되어 있으면 이를 제외 
omit과 동일하나, exclude는 
naresid,napredict를 사용한느 함수에서 
NA로 제외한 행을 결과에 추가한다.
함수 정의 
• 기본 정의 
함수명 <- function(인자…){ 
.. 
return(반환값) #반환값이 없으면 생략 가능 
} 
ex) 
add <- function(x,y){ 
return x+y 
} 
add(1,2) 
• 가변 길이 인자 
f<-function(...){ 
+ args<-list(...) 
+ for(a in args){ 
+ print(a) 
+ } 
+ } 
> f(3,4,5,6,7) 
[1] 3 
[1] 4 
[1] 5 
[1] 6 
[1] 7 
cf. Java argv[] 
• 중첩 함수
함수 정의 
• 중첩함수 
– 함수안에 정의된 함수 
– 내부 함수가 외부함수에 정의된 변수를 접근할 수 있다. (Closure) 
f<-function(x1){ 
+ return(function(x2){ 
+ return (x1+x2) 
+ }) 
+ } 
> f(10) 
function(x2){ 
return (x1+x2) 
} 
<environment: 0x000000000bd9fa20> 
> 
> g1<-f(10) 
> g1(2) 
[1] 12 
g1은 function(x2)가 저장됨 
f<-function(x){ 
+ g<-function(y){ 
+ print(x) 
+ print(y) 
+ } 
+ g(10) 
+ } 
> 
> f(99) 
[1] 99 
[1] 10 
함수 g에서 외부함수 
에 정의된 변수 x를 
참조함
스코프 
• 변수의 스코프 
– 변수가 정의된 스코프(함수) 내에서만 유효함 
– 함수내부에서 전역 변수와 이름이 같은 지역 변수를 사용하면 지역변수가 우선함 (다른 언어와 거의 유사) 
rm( 삭제할 객체의 목록, list=삭제할 객체를 나열한 벡터,envir=as.environment(pos) 객체를 삭제할 환경) 
rm("f") 
> rm(ls()) 
Error in rm(ls()) : ...는 반드시 이름 또는 문자열을 포함하고 있어야 합니다 
> rm(list=ls()) # 현재 환경의 모든 변수/함수 지우기 
ls( name, 객체를 나열할 환경의 이름 
envir #name 대신 직접 환경을 지정할 경우 사용 
) 
※ 반환값은 객체이름의 문자열 벡터 
• “<<-” 
: 상위 스코프에 해당 변수가 있으면 그 변수를 사용, 없으면 상위 스코프에 변수를 생성 
f<-function(x){ 
+ y=x 
+ print(y) 
+ } 
> f(10) 
[1] 10 
> y 
Error: object 'y' not found 
f2<-function(x){ 
+ y<<-x 
+ print(y) 
+ } 
> f2(100) 
[1] 100 
> y 
[1] 100 
변수 y가 f2안에서 <<- 로 지정되어, 상위 스코프에서 생성됨
값에 의한 전달 (Pass By Value) 
• 함수에 객체를 전달할때 Pass by value 형식으로 전달 
– 값을 복사해서 전달 (cf. C언어의 call by value와 동일 개념) 
– 그렇다면 실제로 복사할까?  메모리 낭비 (Copy on write/copy on modify) 
객체의 불변성 (immutable) 
• R에서 객체를 수정하면, 실제로 그 객체가 수정되는 것이 아니라, 새로운 객체를 수정된 값으로 
만든 후 지정하는것 
※ 자바에서 string 수정과 동일한 개념 
> a<-list() 
> tracemem(a) 
[1] "<0x000000002d90fa68>" 
> a$a<-c(3,4,5) 
tracemem[0x000000002d90fa68 -> 0x000000002d8f3128]: 
> a$a<-c(3,4,2) 
tracemem[0x000000002d8f3128 -> 0x000000002d8c3410]: 
> a$b<-c(4,5,6) 
tracemem[0x000000002d8c3410 -> 0x000000002d0b3050]: 
> untracemem(a) 
tracemem()이라는 함수를 이용하여, 객체의 메모리 주소 변화를 추적 가능 
list에 값을 추가하거나 삭제할때 마다 변수 a의 주소가 바뀌는 것을 확인할 수 
있음. 이는 a의 내용이 바뀔때 마다 기존 객체를 수정하는 것이 아니라 새로운 
객체로 바뀌는 것임 
벡터 연산의 효용성 
v <-1:100 
for(i in v){ 
+ v[i]=v[i]+10 
+ } 
객체의 불변성에 의해서 100번 새로운 벡터를 만듬 
※ 실제로 tracemem 해보면 주소가 안바뀐다. 버전이나 
OS별로 최적화가 되어 있는듯?? 
v <-1:100 
v <- v+10 
이 경우, 벡터 v+10한 객체 하나를 만든후 다시 v에 지정 
하기 때문에 위와 달리 효용성이 높다
모듈패턴 
• 일반적인 프로그래밍 패턴중의 하나 
• 함수를 중첩함수로 구현해서, 외부에서 접근을 못하도록 막는 구현패턴(자바 클래스의 private 메 
서드 처럼) 
bird<-function(){ 
fly<-function(){ 
print("i'm fly") 
} 
eat<-function(){ 
print("i'm eating") 
} 
return(list(fly=fly,eat=eat)) 
} 
> b<-bird() 
> b$fly() [1] "i'm fly“ 
> bird$fly() 
Error in bird$fly : object of type 'closure' is not 
subsettable 
리턴 값으로 명시적으로 함수를 넘겨 주면, 이 경우에는 접근 가능 
일반적으로는 내부의 함수를 접근할 수 없음 
질문 : R에는 클래스의 개념이 없는가?

More Related Content

PPTX
R 기본-데이타형 소개
PPTX
R 프로그래밍-향상된 데이타 조작
PPTX
R 프로그램의 이해와 활용 v1.1
PDF
알고리즘과 자료구조
PDF
R 스터디 네번째
PDF
R 스터디 첫번째
PDF
R 스터디 두번째
PPTX
Data Mining with R CH1 요약
R 기본-데이타형 소개
R 프로그래밍-향상된 데이타 조작
R 프로그램의 이해와 활용 v1.1
알고리즘과 자료구조
R 스터디 네번째
R 스터디 첫번째
R 스터디 두번째
Data Mining with R CH1 요약

What's hot (20)

PDF
R 기초 : R Basics
PDF
R 스터디 세번째
PPTX
R과 기초통계 : 02.기술통계-자료나타내기
PPTX
R intro
PDF
알고리즘 스터디(정렬) Seungdols
PPT
1.자료구조와 알고리즘(강의자료)
PDF
3. linked list
PPTX
통계자료 분석을 위한 R
PDF
R_datamining
PPTX
Python+numpy pandas 2편
PDF
Example
PPTX
빠르게 활용하는 파이썬3 스터디(ch1~4)
PDF
Tensorflow regression 텐서플로우 회귀
PPTX
머신 러닝 입문 #1-머신러닝 소개와 kNN 소개
PDF
Binary Search
PPTX
R 기초 II
PPTX
파이썬 Collections 모듈 이해하기
PPTX
[devil's camp] - 알고리즘 대회와 STL (박인서)
PDF
나에 첫번째 자바8 람다식 지앤선
PPTX
파이썬+함수이해하기 20160229
R 기초 : R Basics
R 스터디 세번째
R과 기초통계 : 02.기술통계-자료나타내기
R intro
알고리즘 스터디(정렬) Seungdols
1.자료구조와 알고리즘(강의자료)
3. linked list
통계자료 분석을 위한 R
R_datamining
Python+numpy pandas 2편
Example
빠르게 활용하는 파이썬3 스터디(ch1~4)
Tensorflow regression 텐서플로우 회귀
머신 러닝 입문 #1-머신러닝 소개와 kNN 소개
Binary Search
R 기초 II
파이썬 Collections 모듈 이해하기
[devil's camp] - 알고리즘 대회와 STL (박인서)
나에 첫번째 자바8 람다식 지앤선
파이썬+함수이해하기 20160229
Ad

Viewers also liked (17)

PPTX
인공 신경망 구현에 관한 간단한 설명
PDF
[모두의연구소] 쫄지말자딥러닝
PPTX
Lie Group Formulation for Robot Mechanics
PDF
Lie Group Formulation for Robot Mechanics
PDF
Introduction to Machine Learning and Deep Learning
PPTX
Introduction to Deep Learning with TensorFlow
PPTX
기계학습(Machine learning) 입문하기
PPTX
쫄지말자딥러닝2 - CNN RNN 포함버전
PPTX
인공지능, 기계학습 그리고 딥러닝
PDF
Large Scale Deep Learning with TensorFlow
PDF
알파고 (바둑 인공지능)의 작동 원리
PPTX
Ai 그까이거
PDF
Deformable Convolutional Network (2017)
PPTX
Learning with side information through modality hallucination (2016)
PPTX
Human Motion Forecasting (Generation) with RNNs
PPTX
Understanding Black-box Predictions via Influence Functions (2017)
PPTX
기계학습 / 딥러닝이란 무엇인가
인공 신경망 구현에 관한 간단한 설명
[모두의연구소] 쫄지말자딥러닝
Lie Group Formulation for Robot Mechanics
Lie Group Formulation for Robot Mechanics
Introduction to Machine Learning and Deep Learning
Introduction to Deep Learning with TensorFlow
기계학습(Machine learning) 입문하기
쫄지말자딥러닝2 - CNN RNN 포함버전
인공지능, 기계학습 그리고 딥러닝
Large Scale Deep Learning with TensorFlow
알파고 (바둑 인공지능)의 작동 원리
Ai 그까이거
Deformable Convolutional Network (2017)
Learning with side information through modality hallucination (2016)
Human Motion Forecasting (Generation) with RNNs
Understanding Black-box Predictions via Influence Functions (2017)
기계학습 / 딥러닝이란 무엇인가
Ad

Similar to R 프로그래밍 기본 문법 (20)

PDF
파이썬 기본 문법
PPTX
파이썬 스터디 2주차
PDF
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
PDF
RPG Maker와 Ruby로 코딩 시작하기 Day 3
PPT
Python3 brief summary
PDF
Python Programming: Function
PPTX
파이썬정리 20160130
PPTX
파이썬+주요+용어+정리 20160304
PDF
스칼라와 스파크 영혼의 듀오
PDF
함수적 사고 2장
PDF
Javascript개발자의 눈으로 python 들여다보기
PDF
Haskell study 5
PPTX
Lua 문법 -함수
PPTX
하스켈 프로그래밍 입문 2
PPTX
포트폴리오에서 사용한 모던 C++
PDF
Haskell study 4
PPT
강의자료3
PDF
Start IoT with JavaScript - 4.객체1
PPTX
Startup JavaScript 6 - 함수, 스코프, 클로저
PDF
3주차 스터디
파이썬 기본 문법
파이썬 스터디 2주차
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
RPG Maker와 Ruby로 코딩 시작하기 Day 3
Python3 brief summary
Python Programming: Function
파이썬정리 20160130
파이썬+주요+용어+정리 20160304
스칼라와 스파크 영혼의 듀오
함수적 사고 2장
Javascript개발자의 눈으로 python 들여다보기
Haskell study 5
Lua 문법 -함수
하스켈 프로그래밍 입문 2
포트폴리오에서 사용한 모던 C++
Haskell study 4
강의자료3
Start IoT with JavaScript - 4.객체1
Startup JavaScript 6 - 함수, 스코프, 클로저
3주차 스터디

More from Terry Cho (20)

PPTX
Kubernetes #6 advanced scheduling
PPTX
Kubernetes #4 volume &amp; stateful set
PPTX
Kubernetes #3 security
PPTX
Kubernetes #2 monitoring
PPTX
Kubernetes #1 intro
PPTX
머신러닝으로 얼굴 인식 모델 개발 삽질기
PPTX
5. 솔루션 카달로그
PPTX
4. 대용량 아키텍쳐 설계 패턴
PPTX
3. 마이크로 서비스 아키텍쳐
PPTX
서비스 지향 아키텍쳐 (SOA)
PPTX
1. 아키텍쳐 설계 프로세스
PPTX
애자일 스크럼과 JIRA
PPTX
REST API 설계
PPTX
모바일 개발 트랜드
PPTX
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
PPTX
Micro Service Architecture의 이해
PPTX
2014 공개소프트웨어 대회 소프트웨어 개발 트렌드의 변화
PPTX
Redis data modeling examples
PPTX
빠르게훓어보는 Node.js와 Vert.x
PPTX
대용량 분산 아키텍쳐 설계 #5. rest
Kubernetes #6 advanced scheduling
Kubernetes #4 volume &amp; stateful set
Kubernetes #3 security
Kubernetes #2 monitoring
Kubernetes #1 intro
머신러닝으로 얼굴 인식 모델 개발 삽질기
5. 솔루션 카달로그
4. 대용량 아키텍쳐 설계 패턴
3. 마이크로 서비스 아키텍쳐
서비스 지향 아키텍쳐 (SOA)
1. 아키텍쳐 설계 프로세스
애자일 스크럼과 JIRA
REST API 설계
모바일 개발 트랜드
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
Micro Service Architecture의 이해
2014 공개소프트웨어 대회 소프트웨어 개발 트렌드의 변화
Redis data modeling examples
빠르게훓어보는 Node.js와 Vert.x
대용량 분산 아키텍쳐 설계 #5. rest

R 프로그래밍 기본 문법

  • 1. R 프로그래밍 기초 #2 R 프로그래밍 기본 문법 2014.11.13 조대협 http://bcho.tistory.com
  • 2. 조건문과 반복문 • 조건문 if if(조건){ .. }else{ .. } ifelse( 조건,TRUE 일때 값,FALSE 일때 값) ex) isEven<-ifelse(x %% 2==0, “even”, “odd); • 반복문 명령 예제 설명 for(i in data){..} for(i in 1:10){ .. } while(조건){..} while(i<=10){ .. } repeat{ .. } repeat{ .. } while(TRUE)와 동일 break 반복문 루프를 빠져 나옴 next 현재 반복을 중단하고 다음 반복을 시작 cf. 자바에서 continue;
  • 3. 연산 • 수치 연산 명령 예제 설명 +,-,/,* 사칙연산 n %% m 나머지 n%/%m 몫 n^m 제곱 exp(n) 푒푛 log(x,base=exp(1)) 푙표푔푏푎푠푒(푥) 만약 base를 정하지 않으면 푙표푔푒 (푥) log2(x),log10(x) 푙표푔2 푥 , 푙표푔10(푥) sin(x),cos(x),tan(x) 각각 삼각함수
  • 4. 연산 • 벡터 연산 (Vectorized Computation) x<-c(1:5) > x [1] 1 2 3 4 5 > x+1 [1] 2 3 4 5 6 > x+x [1] 2 4 6 8 10 > sum(x) [1] 15 > mean(x) [1] 3 > x [1] 1 2 3 4 5 > x == c(2:6) [1] FALSE FALSE FALSE FALSE FALSE > x == c(1,3:7) [1] TRUE FALSE FALSE FALSE FALSE FALSE Warning message: In x == c(1, 3:7) : longer object length is not a multiple of shorter object length > x == c(1,3:6) [1] TRUE FALSE FALSE FALSE FALSE > ifelse(x %%2==0,"even","odd") [1] "odd" "even" "odd" "even" "odd"
  • 5. NA 값의 처리 • NA : 값이 기록되지 않았거나 관측이 되지 않음 경우. “결측치”라고 함. NULL과 다름 • 데이타에 NA가 포함되어 있으면 모든 계산 결과는 NA가 됨 • 이를 피하기 위해서, R function에는 na.rm=TRUE라는 인자를 넘길 수 있음. (이경우 NA값을 해 당 연산에서 제외함) NA&TRUE [1] NA > NA+1 [1] NA > NA-1 [1] NA > sum(c(1:3,NA)) [1] NA > sum(c(1:3,NA),na.rm=TRUE) [1] 6 명령 예제 설명 na.fail(object) object에 NA 가 포함되면 fail na.pass(object) object에 NA가 포함되어 있더라도 pass na.omit object에 NA가 포함되어 있으면 이를 제외 na.exclude object에 NA가 포함되어 있으면 이를 제외 omit과 동일하나, exclude는 naresid,napredict를 사용한느 함수에서 NA로 제외한 행을 결과에 추가한다.
  • 6. 함수 정의 • 기본 정의 함수명 <- function(인자…){ .. return(반환값) #반환값이 없으면 생략 가능 } ex) add <- function(x,y){ return x+y } add(1,2) • 가변 길이 인자 f<-function(...){ + args<-list(...) + for(a in args){ + print(a) + } + } > f(3,4,5,6,7) [1] 3 [1] 4 [1] 5 [1] 6 [1] 7 cf. Java argv[] • 중첩 함수
  • 7. 함수 정의 • 중첩함수 – 함수안에 정의된 함수 – 내부 함수가 외부함수에 정의된 변수를 접근할 수 있다. (Closure) f<-function(x1){ + return(function(x2){ + return (x1+x2) + }) + } > f(10) function(x2){ return (x1+x2) } <environment: 0x000000000bd9fa20> > > g1<-f(10) > g1(2) [1] 12 g1은 function(x2)가 저장됨 f<-function(x){ + g<-function(y){ + print(x) + print(y) + } + g(10) + } > > f(99) [1] 99 [1] 10 함수 g에서 외부함수 에 정의된 변수 x를 참조함
  • 8. 스코프 • 변수의 스코프 – 변수가 정의된 스코프(함수) 내에서만 유효함 – 함수내부에서 전역 변수와 이름이 같은 지역 변수를 사용하면 지역변수가 우선함 (다른 언어와 거의 유사) rm( 삭제할 객체의 목록, list=삭제할 객체를 나열한 벡터,envir=as.environment(pos) 객체를 삭제할 환경) rm("f") > rm(ls()) Error in rm(ls()) : ...는 반드시 이름 또는 문자열을 포함하고 있어야 합니다 > rm(list=ls()) # 현재 환경의 모든 변수/함수 지우기 ls( name, 객체를 나열할 환경의 이름 envir #name 대신 직접 환경을 지정할 경우 사용 ) ※ 반환값은 객체이름의 문자열 벡터 • “<<-” : 상위 스코프에 해당 변수가 있으면 그 변수를 사용, 없으면 상위 스코프에 변수를 생성 f<-function(x){ + y=x + print(y) + } > f(10) [1] 10 > y Error: object 'y' not found f2<-function(x){ + y<<-x + print(y) + } > f2(100) [1] 100 > y [1] 100 변수 y가 f2안에서 <<- 로 지정되어, 상위 스코프에서 생성됨
  • 9. 값에 의한 전달 (Pass By Value) • 함수에 객체를 전달할때 Pass by value 형식으로 전달 – 값을 복사해서 전달 (cf. C언어의 call by value와 동일 개념) – 그렇다면 실제로 복사할까?  메모리 낭비 (Copy on write/copy on modify) 객체의 불변성 (immutable) • R에서 객체를 수정하면, 실제로 그 객체가 수정되는 것이 아니라, 새로운 객체를 수정된 값으로 만든 후 지정하는것 ※ 자바에서 string 수정과 동일한 개념 > a<-list() > tracemem(a) [1] "<0x000000002d90fa68>" > a$a<-c(3,4,5) tracemem[0x000000002d90fa68 -> 0x000000002d8f3128]: > a$a<-c(3,4,2) tracemem[0x000000002d8f3128 -> 0x000000002d8c3410]: > a$b<-c(4,5,6) tracemem[0x000000002d8c3410 -> 0x000000002d0b3050]: > untracemem(a) tracemem()이라는 함수를 이용하여, 객체의 메모리 주소 변화를 추적 가능 list에 값을 추가하거나 삭제할때 마다 변수 a의 주소가 바뀌는 것을 확인할 수 있음. 이는 a의 내용이 바뀔때 마다 기존 객체를 수정하는 것이 아니라 새로운 객체로 바뀌는 것임 벡터 연산의 효용성 v <-1:100 for(i in v){ + v[i]=v[i]+10 + } 객체의 불변성에 의해서 100번 새로운 벡터를 만듬 ※ 실제로 tracemem 해보면 주소가 안바뀐다. 버전이나 OS별로 최적화가 되어 있는듯?? v <-1:100 v <- v+10 이 경우, 벡터 v+10한 객체 하나를 만든후 다시 v에 지정 하기 때문에 위와 달리 효용성이 높다
  • 10. 모듈패턴 • 일반적인 프로그래밍 패턴중의 하나 • 함수를 중첩함수로 구현해서, 외부에서 접근을 못하도록 막는 구현패턴(자바 클래스의 private 메 서드 처럼) bird<-function(){ fly<-function(){ print("i'm fly") } eat<-function(){ print("i'm eating") } return(list(fly=fly,eat=eat)) } > b<-bird() > b$fly() [1] "i'm fly“ > bird$fly() Error in bird$fly : object of type 'closure' is not subsettable 리턴 값으로 명시적으로 함수를 넘겨 주면, 이 경우에는 접근 가능 일반적으로는 내부의 함수를 접근할 수 없음 질문 : R에는 클래스의 개념이 없는가?