SlideShare ist ein Scribd-Unternehmen logo
1 von 10
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에는 클래스의 개념이 없는가?

Weitere ähnliche Inhalte

Was ist angesagt?

1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)
fmbvbfhs
 
통계자료 분석을 위한 R
통계자료 분석을 위한 R통계자료 분석을 위한 R
통계자료 분석을 위한 R
Yoonwhan Lee
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
SeongHyun Ahn
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
daewon jeong
 

Was ist angesagt? (20)

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

Andere mochten auch

Andere mochten auch (17)

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

Ähnlich wie R 프로그래밍 기본 문법

파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
Yong Joon Moon
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
지수 윤
 

Ähnlich wie R 프로그래밍 기본 문법 (20)

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

Mehr von Terry Cho

Mehr von Terry Cho (20)

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