#4제어문,연산,함수
#IF, FOR, WHILE
if (TRUE){
  print('TRUE')
  print('hello')
} else {
  print('FALSE')
  print('world')
}
## [1] "TRUE"
## [1] "hello"
for (i in 1:10){
  print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
i <- 0
while(i<10){
  print(i)
  i<- i+1
}
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
#행렬 연산
x<-matrix(c(1,2,3,4),nrow=2,byrow=TRUE)
x
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
x+x
##      [,1] [,2]
## [1,]    2    4
## [2,]    6    8
x%*%x
##      [,1] [,2]
## [1,]    7   10
## [2,]   15   22
t(x)
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
solve(x)
##      [,1] [,2]
## [1,] -2.0  1.0
## [2,]  1.5 -0.5
#NA의 처리
NA & TRUE
## [1] NA
NA+1
## [1] NA
sum(c(1,2,3,NA))
## [1] NA
sum(c(1,2,3,NA),na.rm=TRUE)
## [1] 6
x<-data.frame(a=c(1,2,3),b=c("a",NA,"c"),c=c("a","b",NA))
x
##   a    b    c
## 1 1    a    a
## 2 2 <NA>    b
## 3 3    c <NA>
na.omit(x)
##   a b c
## 1 1 a a
na.pass(x)
##   a    b    c
## 1 1    a    a
## 2 2 <NA>    b
## 3 3    c <NA>
#na.fail(x)

#함수의 정의
fibo <- function(n){
  if (n==1 || n==2){
    return(1)
  }
  return(fibo(n-1)+fibo(n-2))
}
fibo(1)
## [1] 1
fibo(5)
## [1] 5
fibo <- function(n){
  if (n==1 || n==2){
    return(1)
  }else{
  fibo(n-1)+fibo(n-2)
  }
}

f <- function(x,y){
  print(x)
  print(y)
}
f(1,2)
## [1] 1
## [1] 2
f(y=1,x=2)
## [1] 2
## [1] 1
f <- function(x,y){
  print(x)
  print(y)
}
g <- function(z,...){
  print(z)
  f(...)
}
g(1,2,3)
## [1] 1
## [1] 2
## [1] 3
f <- function(x,y){
  print(x)
  g <- function(y){
    print(y)
  }
  g(y)
}
f(1,2)
## [1] 1
## [1] 2
#스코프(Scope)
n <- 1
f <- function(){
  print(n)
}
f()
## [1] 1
n <- 2
f()
## [1] 2
n <- 100
f <- function(){
  n <- 1
  print(n)
}
f()
## [1] 1
rm(list=ls())
f <- function(){
  print(x)
}
#f()

rm(list=ls())
f <- function(){
  x <- 1
}
f()
#x

n <- 100
f <- function(n){
  print(n)
}
f(1)
## [1] 1
f <- function(x){
  a <- 2
  g <- function(y){
    print(y+a)
  }
  g(x)
}
f(1)
## [1] 3
a <- 100
f <- function(x){
  g <- function(y){
    print(y+a)
  }
  g(x)
}
f(1)
## [1] 101
f <- function(){
  a <- 1
  g <- function(){
    a <-2
    print(a)
  }
  g()
  print(a)
}
f()
## [1] 2
## [1] 1
b <- 0
f <- function(){
  a <- 1
  g <- function(){
    a <<- 2
    b <<- 2
    print(a)
    print(b)
  }
  g()
  print(a)
  print(b)
}
f()
## [1] 2
## [1] 2
## [1] 2
## [1] 2
#벡터 연산
x <- c(1,2,3,4,5)
x + 1
## [1] 2 3 4 5 6
x <- c(1,2,3,4,5)
x + x
## [1]  2  4  6  8 10
x == x
## [1] TRUE TRUE TRUE TRUE TRUE
x == c(1,2,3,5,5)
## [1]  TRUE  TRUE  TRUE FALSE  TRUE
c(T,T,T) == c(T,F,T)
## [1]  TRUE FALSE  TRUE
x <- c(1,2,3,4,5)
sum(x)
## [1] 15
mean(x)
## [1] 3
median(x)
## [1] 3
x <- c(1,2,3,4,5)
ifelse(x%%2 ==0, "even","odd")
## [1] "odd"  "even" "odd"  "even" "odd"
(d <- data.frame(x=c(1,2,3,4,5), y=c("a","b","c","d","e")))
##   x y
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
## 5 5 e
d[c(TRUE,FALSE,TRUE,FALSE,TRUE),]
##   x y
## 1 1 a
## 3 3 c
## 5 5 e
d[d$x %% 2==0,]
##   x y
## 2 2 b
## 4 4 d
#객체의 불변성
v <- 1:1000
for (i in 1:1000){
  v[i] <- v[i] +1
}

v <- 1:1000
v <- v+1

#객체의 삭제
x <- c(1,2,3,4,5)
ls()
## [1] "a" "b" "d" "f" "i" "n" "v" "x"
rm("x")
ls()
## [1] "a" "b" "d" "f" "i" "n" "v"
rm(list=ls())