본문 바로가기

R

[R] 함수, 중첩함수

함수(function)

: 반복되어 사용하는 기능을 정의하는 기능의 프로그램

함수이름 <- function(){

함수내에서 수행해야할 코드

return(반환값) (→return은 option)

}

 

매개변수(parameter variable)

형식매개변수(formal parameter variable),입력변수 : arg1,arg2

실제매개변수(actual parameter variable) : 'king',x

가변인수(...)

: 인수의 개수를 고정하지 않아야 할때 사용

⇒리스트,벡터,슬라이딩 형식 모두 변수로 사용가능


[문제96] hap함수에 숫자를 입력하게 되면 1부터 입력숫자까지 누적합을 구하는 함수를 구현해주세요.

더보기
①
hap <- function(arg1){
res<-0
for(i in 1:arg1){
res<-res+i
}
return(res)
}
②
hap <- function(arg1){
res <- sum(1:arg1)
return(res)
}

[문제97] odd함수에 숫자를 입력하게 되면 1부터 입력숫자까지 홀수의 합을 구하는 함수를 구현해주세요.

더보기
odd <- NULL
odd <- function(arg1){
if(arg1<=0){
NULL
} else{
res <- 0
for(i in 1:arg1){
if(i%%2 !=0){
res <- res + i
}
}
return(res)
}
}

[문제98] 약수를 리턴하는 divisor함수를 생성해주세요. 약수 : 어떤수를 나누어 떨어지게 하는 자연수

더보기
divisor <- NULL
divisor <- function(arg){
num <- NULL
for(i in 1:arg){
if(arg %% i ==0){
num <- c(num,i)
}
}
return(num)
} ⇒ 의미없이 함수가 돌아가는 구간이 있음

divisor <- function(arg){
num <- NULL
for(i in 1:(arg/2)){
if(arg %% i ==0){
num <- c(num,i)
}
}
return(c(num,arg))
} ⇒ 개선

[문제99] 입력값으로 들어온 수에 대한 합을 구하는 hap함수를 생성하세요.

더보기
hap <- function(...){
v_sum <- 0
for(i in c(...)){
v_sum<-v_sum+i
}
return(v_sum)
}

[문제100] 평균을 구하는 avg함수를 생성해주세요.

더보기
avg <- function(...){
x <- na.omit(c(...)) → NA제거
v_sum <- 0
v_cn <- 0
for(i in x){
v_sum <- v_sum+i
v_cn <- v_cn + 1
}
return(v_sum/v_cn)
}

[문제101] 짝수, 홀수를 출력하는 odd_even함수를 생성해주세요.

odd_even(1:5)

[1] "홀수" "짝수" "홀수" "짝수" "홀수"

odd_even(c(1,2,3,4,5))

[1] "홀수" "짝수" "홀수" "짝수" "홀수"

더보기
①
odd_even <- function(...){
v <- NULL
x <- na.omit(c(...))
for(i in x){
if(i %% 2 == 0){
v <- c(v,"짝수")
} else {
v <- c(v,"홀수")
}
}
return(v)
}
②
odd_even <- function(...){
ifelse(c(...)%%2==0,"짝수","홀수")
}

전역변수, 지역변수

전역변수(global variable)

: 프로그램 전체에서(세션이 열려 있는 동안) 사용할 수 있는 변수

지역변수(private variable, local variable)

: 함수내에서만 정의되고 사용할 수 있는 변수

 

전역변수와 지역변수가 같을 때

함수 안에서는 지역변수의 우선순위가 더 높음

하지만, 전역변수 y는 여전히 2

 

지역변수를 전역변수로 이용하고 싶다면

<<- 사용하면함수 안에서 선언된 y(지역변수)가 전역변수가 됨

 

sum(x1<-c(1,2,3,4,5))
sum(x2<<-c(1,2,3,4,5))
sum(x3=c(1,2,3,4,5))
x1과 x2는 전역 변수가 생성되지만, 

x3는 생성되지 않음(오류는 발생하지 않음)

 

중첩함수

: 함수 안에 함수 사용

f 함수 안에 f2 함수 중첩

 

중첩함수에서

private variable : 함수가 중첩된 함수일 경우 메인 함수의 arg1,arg2

함수내에서 어디서든 사용할 수 있다.

local variable : 함수가 중첩된 함수일 경우 중첩함수에서 선언된 arg3 변수는

중첩함수내에서만 사용할 수 있다.


[문제102] avg함수 안에 hap함수를 중첩해서 avg함수를 생성해주세요.

더보기
avg <- function(...){
x <- na.omit(c(...)) #x<-c(1,2,3,4,5)

hap<-function(...){
y <- c(...) #y<-c(1,2,3,4,5)
v_sum <- 0
for(i in y){
v_sum <- v_sum + i
}
return(v_sum)
}

return(hap(x)/length(x)) #hap함수에서 리턴(v_sum)한 값이 이곳으로 온다.
}

[문제103] 분산을 구하는 variance 함수를 생성하세요.
합((개별관측값-평균)^2)
----------------------
        n-1

더보기

 

①
합
v_sum<-0
v_cnt<-0
for(i in x){
v_sum<-v_sum+i #누적합
v_cnt<-v_cnt+1 #관측값의 수
}
평균
v_avg <- v_sum/v_cnt #v_cnt=length(x)
편차
sum((x-v_avg)**2)/(v_cnt-1) 또는
v_hap<-0
for(i in x){
v_hap <- v_hap + ((i-v_avg)**2) #=sum((x-v_avg)**2)
}
v_hap/(v_cnt-1)
⇒ variance <- function(...){
   x <- na.omit(c(...))
   v_sum<-0
   v_cnt<-0
   for(i in x){
     v_sum<-v_sum+i #누적합
     v_cnt<-v_cnt+1 #관측값의 수
    }
   v_avg<-v_sum/v_cnt
   v_hap<-0
   for(i in x){
     v_hap <- v_hap + ((i-v_avg)**2) #=sum((x-v_avg)**2)
    }
   return(v_hap/(v_cnt-1))
  }

②
variance <- function(...){
 x <- na.omit(c(...))
 var <- sum((x-mean(x))^2)/(length(x)-1)
 return(var)
}

sqrt(variance) : 표준편차

[문제104]사원 번호를 입력 값으로 받아서 사원의 LAST_NAME, SALARY를 출력하는 find 함수를 생성하세요.
find(100)
LAST_NAME SALARY
King  24000

find(300)
"사원이 존재하지 않습니다."

더보기
①
find <- function(x){
if(NROW(employees[employees$EMPLOYEE_ID==x,])==0){
print("사원이 존재하지 않습니다.")
} else {
return(employees[employees$EMPLOYEE_ID==x,c('LAST_NAME','SALARY')])
}
}

②
find <- function(x){
df <- employees[employees$EMPLOYEE_ID==x,c('LAST_NAME','SALARY')]
if(NROW(df)==0){
print("사원이 존재하지 않습니다.")
} else {
print(df)
}
}

#100번 사원 제외 NULL=return()

find <- function(x){
  if(x==100){
    return() #NULL
  } else {
  df <- employees[employees$EMPLOYEE_ID==x,c('LAST_NAME','SALARY')]
  if(NROW(df)==0){
    print("사원이 존재하지 않습니다.")
  } else {
    print(df)
  }
}
}

stop VS warning

stop : 오류메세지와 함께 함수를 아예 종료함.

warning : 오류 메세지만 출력하고 함수는 계속 수행됨.

'R' 카테고리의 다른 글

[R] subset  (0) 2022.01.18
[R] merge  (0) 2022.01.17
[R] 반복문 - for, while, repeat  (0) 2022.01.14
[R] 조건제어문 - if, ifelse, switch  (0) 2022.01.14
[R] apply, lapply, sapply, mpply, tapply  (0) 2022.01.14
Recent Posts
Popular Posts
Recent Comments