setwd('/BiO/example/dataset')

x <- 1:5
y <- -2:2
if(any(x<0)) print(x) # 하나의 논리값을 위해 any 사용
if(any(y<0)) print(abs(y))
if(y<0) print(y) # 벡터논리값은 error
if(any(y<0)) 
{
  print(abs(y))
  cat("\n y contains negative values")
}
# print(x)는 x의 내용을 보여 주는 함수.

if(pi>3) cat("\n expr(T)") else cat("\n expr(F)")
if(pi<3) cat("\n expr(T)") else cat("\n expr(F)")
x <- 1:3
if(length(x)==5) {
  if(sum(x)== 15)
    cat("\n Vector x length=",length(x),", sum = ",sum(x))
} else {
  cat("\n Vector x length !=",length(x))
}
# if(length(x)==5 && sum(x)==15) 동시 비교 가능


x = c(10,3,6,9)
y = c(1,5,4,12)
ifelse(x>y,x,y)
score = c(80, 75, 40, 98)
grade = ifelse(score >= 50, "pass", "fail")
data.frame(score, grade)

y <- -2:2
ifelse(y >=0, y, -y)
abs(y)

tmp <- c(3,-1,1,-2,0)
sn=ifelse(tmp>0,"pos",ifelse(tmp<0,"neg","zero"))
data.frame(tmp,sn)

# for
s = 0
for(i in 1:100)
{
  s = s + i
}
# s 변수를 이용하여 계속 누적합을 계산한다.

sum(1:100) # 동일한 값, for문보다 효율적인 계산

# file 여러개 생성 10개씩 잘라서 저장
dir.create('./datafile')
f_pre = './datafile/file_'
f_post = '.txt'
dat = mtcars
n = nrow(dat)
cut = 10
nfile = ceiling(n/cut)
for(i in 1:(nfile-1))
{
  ind = (cut*(i-1)+1):(cut*i)
  write.table(dat[ind,],
              file=paste0(f_pre,i,f_post),sep='\t')
}
ind = (cut*i+1):n
write.table(dat[ind,],
            file=paste0(f_pre,i+1,f_post),sep='\t')


# while 

# Sum from 1 to 100
s = 0
i = 1 
while( i<=100 )
{
  s = s+i
  i = i+1
}
# for문과 다르게 조건과 관련된 변수의 증감을 조절해야 함.

# 특정 단어를 만나기 전까지 Parsing 작업 수행
ch = c("A/B/C/D/F","A/AA","BB/B","Quit","CC/C")
xp = list()
i = 1
while(ch[i]!="Quit" & i <= length(ch))
{
  xp[[i]] = unlist(strsplit(ch[i],'/'))
  print(xp[[i]])
  i = i + 1  
}
table(unlist(xp))

s = 0
for ( i in 1:10)
{
  s = s+i
  if(s>=10) break
} # stop if sum of 1:x >= 10
c(i,s)

s = 0
for ( i in 1:10)
{
  if(i %% 2 ==1) next  
  s = s+i   
}  # sum even values from 1 to 10

# system.time 함수 이용
# 함수에 대한 시간 측정이 용이 
system.time({ sum(as.double(1:1e6)) })
# for 문을 쓰면 { } 블럭화 해야 함.
system.time( { s = 0; 
for( i in 1:1e6) {
  s = s+ i } } )
# 1e6 = 1 * 10^6, 1e-4 = 1 * 10^-4
y <- system.time({ sum(as.double(1:1e6)) })
y[1]; y[2]; y[3]



# Sys.time() 함수 이용
# 현재시간과 실행 후의 시간을 비교하여 직접 계산
# 반복문에 대한 시간측정이 용이 
tic = Sys.time() #현재시간
sum(as.double(1:1e6))
toc = Sys.time() #실행이 끝난 시간
as.numeric(toc-tic, units="secs")

tic = Sys.time()
s = 0
for(i in 1:1e6)
{
  s = s+i
}
toc = Sys.time() #실행이 끝난 시간
as.numeric(toc-tic, units="secs")

s = 0
i = 1
while(i <= 100)
{
  s = s + i
}
# i를 증가시키는 것을 누락, 조건이 항상 참이므로 무한루프
# Esc를 눌러 빠져나온 뒤 s값을 확인하면 매우 많이 실행 된 것을 확인할 수 있다.


# User defined function

wd_count = function(x,sep=" ")
{
  temp = gsub("[(),.?!/ ]",sep,x)
  temp = unlist(strsplit(temp,sep))
  temp = unlist(temp)
  temp = temp[temp!=""]
  return(table(temp))
}

tx_data = c("Hello, I like statistics.",
            "I want to go out.",
            "You need to take a break.",
            "You are so nice.")
res = wd_count(tx_data)
sort(res,decreasing=T)

#Fibonacci
fibo <- function(n)
{
  if(n==1) return(1)
  if(n==2) return(rep(1,2))
  x <- rep(1,n)
  for(i in 3:n)
    x[i] <- x[i-1]+x[i-2]
  return(x)
}
fibo(1)
fibo(2)
fibo(10)

# function
a <- c(1,3,5,6)
std.ftn <- function(x) # 함수의 정의는 가능
  return(mean(x),var(x), (x-mean(x))/sd(x))
std.ftn(a)  # error

std.ftn2 <- function(x)
  return(list(mean=mean(x),var=var(x),
              std=(x-mean(x))/sd(x)))
std.ftn2(a)

ls # 함수 원형, 실행되는 것이 아닌 정의된 것을 보여줌.
ls() # 함수 실행

wd_count 
fibo
std.ftn
read.table # 인수의 이름을 파악할 때, 도움이 된다.

a <- c(1,3,5)
noact <- function(x)
{
  loc <- 3
  return(loc)
}
noact(a)
loc # error

a <- c(1,3,5)
noact <- function(x){
  a[1] <- 3
  return(a)
}
noact(10)
a

a <- c(1,3,5)
noact <- function(x){
  a[1] <- 3; glb <<- c(1,2)
  return(a) }
noact(10)
a; glb

a <- c(1,3,5)
noact <- function(x,type=1){
  if(type==1) a[1] <- 3
  if(type==2) a[1] <<- 3   
  return(a) }
noact(10) # noact(10,1)
a
noact(5,2)
a