(5주차) 10월7일
while, break, ifelse, repeat, next, switch, 산술연산자, 논리연산자, 비교연산자
-
(1/4) while, break, ifelse
-
(2/4) switch, reapeat, next
-
(3/4) 산술연산자, 논리연산자
-
(4/4) 비교연산자, 과제설명
-
예제1
tot = 0
i = 1
while(i<=100){
tot=tot+i
i = i+1
}
tot
-
예제1의 다른구현(1)
tot=0
for (i in 1:100) tot = tot +i
tot
-
예제1의 다른구현(2)
tot = 0
i = 1
while(TRUE){
tot = tot+i
i=i+1
if (i>100) break
}
tot
-
예제1의 다른구현(3)
tot = 0
i = 1
while(TRUE){
tot = tot+i
if (i>=100) break
i=i+1
}
tot
-
저는 while을 싫어합니다.
-
어쩔수 없이 써야할때가 있어서 알고있는 것입니다.
-
예제1
for (i in 1:10){
print(i)
if(i==3) break
}
-
예제2
for (i in 1:10){
for (j in 1:10){
print(c(i,j))
if(j==3) break
}
if(i==5) break
}
-
예제1
x= -2:2
x
ifelse(x>0,x,-x)
-
예제1의 다른구현
length(x)
y_ = x*0
y_
for (i in 1:length(x)){
if (x[i]>0) y_[i] = x[i] else
y_[i] = -x[i]
}
y_
-
예제2
x= -5:5
x
y=ifelse(x<0, 0, ifelse(x>2,x,1))
y
plot(x,x)
points(x,y,col=2,pch=16)
-
예제2의 다른구현
x= -5:5
x
y=x*0
y
n=length(x)
n
for(i in 1:n){
if(x[i]<0) y[i]=0 else
if (x[i]>2) y[i]=x[i] else
y[i]=1
}
y
-
ifelse와 if~else는 성격이 조금 다름
- ifelse: 조건에 부합하는 새로운 벡터를 생성하는데 특화되어있음
- if~else: 조건에 따라 코드의 실행흐름을 제어하는 성격의 문법
-
예제1
switch(1, 10,20,30)
switch(2, 10,20,30)
switch(3, 10,20,30)
-
예제2
switch(1, c(1,2,3),20,c(30,40))
switch(2, c(1,2,3),20,c(30,40))
switch(3, c(1,2,3),20,c(30,40))
-
예제3
switch('a1', a1=c(1,2,3),a2=20,a3=c(30,40))
switch('a2', a1=c(1,2,3),a2=20,a3=c(30,40))
switch('a3', a1=c(1,2,3),a2=20,a3=c(30,40))
-
예제4
(예비학습)
x=1:10
x
c(
mean(x),
mean(x**2),
mean((x-mean(x))**2)
)
38.50 - 5.50**2
(예제시작)
switch("f1",
f1=mean(x),
f2=mean(x**2),
f3=mean((x-mean(x))**2)
)
switch("f2",
f1=mean(x),
f2=mean(x**2),
f3=mean((x-mean(x))**2)
)
switch("f3",
f1=mean(x),
f2=mean(x**2),
f3=mean((x-mean(x))**2)
)
-
예제5
myfun<-function(x,f){
switch(f,
meann=mean(x),
sqmeann=mean(x**2),
varr=mean((x-mean(x))**2)
)
}
x=1:5
myfun(x,"meann")
myfun(x,"sqmeann")
myfun(x,"varr")
-
예제1
tot=0
i=1
repeat{
tot=tot+i
i=i+1
if (i>100) break
}
tot
-
잘못된 예제1
tot=0
i=1
repeat{
tot=tot+i
i=i+1
}
-
예제1
for(i in 1:5){
if(i==3) next else
print(i)
}
break와 비교
for(i in 1:5){
if(i==3) break else
print(i)
}
-
예제2
i=0
repeat{
i=i+1
if (i>5) break
if (i==3) next
print(i)
}
-
조건: if, if~else / ifelse, switch
-
반복: for, while, repeat
-
루프탈출: break, next
-
예제1
5+2
6-2
3*4
6/5
-
예제2
2^3
2**3
-
예제3
31%%3
31%/%3
-
예제1
x=c(T,T,F,F,T)
y=c(TRUE,FALSE,TRUE,FALSE,TRUE)
x
y
print(x)
print(!x)
print(y)
print(!y)
-
예제2: 예제1의 응용
x=1:30
x
x%%3
x[x%%3==0] # 3의 배수인것만 출력
x[!(x%%3==0)] # 3의 배수가 아닌것만 출력
-
예제2의 다른구현 (논리연산자와 TRUE/FALSE 로 이루어진 열을 다루는데 익숙하지 않다면 고생스러울 때가 있음)
x<-c()
j=1
for (i in 1:30){
if (i%%3 == 0) {
x[j]= i
j=j+1
}
}
x
x<-c()
j=1
for (i in 1:30){
if (i%%3 != 0) {
x[j]= i
j=j+1
}
}
x
-
예제3
x=c(T,T,F,F,T)
y=c(T,F,T,F,T)
print(x)
print(y)
print(x&y) ## and 연산자, 하나라도 FALSE이면 FALSE
-
예제4: 예제3의 응용
x=1:50
x[(x>30) & (x%%3==0)] # 30보다크고, 3의 배수인것들
x[(x>30) & !(x%%3==0)]
-
예제5
x=c(T,T,F,F,T)
y=c(T,F,T,F,T)
print(x)
print(y)
print(x|y) ## or 연산자, 하나라도 TRUE이면 TRUE
-
예제6: 예제5를 응용
x=1:50
x
x>30 | x<10
x[x>30 | x<10]
-
예제7
x=c(T,F,T,T,F)
y=c(F,T,F,F,T)
print(x)
print(y)
print(x&&y)
- x&&y 와 (x&y)[1]는 거의 같음
-
예제8
x=c(T,F,T,T,F)
y=c(F,T,F,F,T)
print(x)
print(y)
print(x||y)
- x||y 와 (x|y)[1]는 거의 같음
-
예제1
x=c(1,2,3,4,5)
y=c(2,2,3,2,1)
x==y
x!=y
!(x==y)
-
예제1의 잘못된 적용 (1)
x=c(1,2,3,4,5)
y=c(2,2,3,2,1)
x=y
x
-
예제1의 잘못된 적용 (2)
x=c(1,2,3,4,5)
y=c(2,2,3,2,1)
x=!y
x
- ???? 왜 이런결과가?
(잘못된 결과의 분석)
!y
!c(1,1,0,0)
!c(2,2,0,0)
-
예제2
x=c(1,2,3,4,5)
y=c(2,2,3,2,1)
x>y
x<y
x>=y
x<=y
-
예제2의 잘못된 사용
x=>y
x=<y
x= -100:100/10
x
아래와 같은 $y$를 생성하라.
$y=\begin{cases} x & |x|>5 \\ 0 & |x| \leq 2 \\ 5 & o.w. \end{cases}$
힌트: ifelse를 중첩, abs()함수를 이용
ifelse(abs(x)>5,x,ifelse(abs(x)<=2,0,5))