함수(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는 생성되지 않음(오류는 발생하지 않음)
중첩함수
: 함수 안에 함수 사용
중첩함수에서
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 |