Review - 반복문 복습 

n = 21
for(i in 1:100){
    cat("collatz : NOW =", n, "\n")
    if (n %% 2 == 0){
        n = n / 2 
    } else {
        n = n*3 + 1 
    }
    if(n == 1){
        cat("collatz : END =", n, "\n")
        break
    }
}

 

 

사용자 정의 함수 

function(<para1>, <para2>, ....){<expression>}

para1, 2 는 매개변수,

expression은 매개변수를 활용한 함수식 

 

 

 

예시1 

Ex0 = function(x) {7*x+5}
Ex0(3)

Ex1 = function(x){
    y = 7*x + 5 
    # 별도로 객체를 정의하여 값을 저장하면
    # 함수를 실행시키더라도 함수값을 출력해주지 않음. 
} 
Ex1(4) 
y 

# 함수 안에서 만들어진 변수는 함수가 종료되면 없어짐.

 

 

예시2 

Ex2 = function(x){
    x^2 + 3*x - 6
}
Ex2(10)

 

 

 

반환하고 싶을 때는 return(<object>)를 사용하여야 함. 

Ex1 = function(x){
    y = 7*x + 5
    return(y)
}

Ex1(4)

 

return을 쓰면 함수를 호출했을 때

함수 내에서 저장한 변수를 return(y)로 반환해줄 수 있음.  

 

return 예시 1 

Ex3 = function(x){
    a = x^2 + 3*x - 6
    b = 2*x^2 - exp(2)
    return(a+b)
}
Ex3(10)

 

return 예시 2 

Ex4 = function(x){
    return(x[2] + x[3])
}
Ex4(c(1:5))

 

매개변수는 단순한 숫자 뿐만 아니라 벡터도 들어갈 수 있음. 

 

 

 

다수의 매개변수와 기본값을 설정한 함수 

Ex5 = function(threshold = 0, vec){
    return(sum(vec > threshold))
}
Ex5(3, -3:10)
Ex5(vec = -3:10)

 

Ex5(3, -3:10) 코드는 순서대로 매개변수의 속성에 맞게 넣었기 때문에 오류가 없이 출력이 된다. 

그러나 Ex5(vec = -3:10) 은 현재 threshold의 값을 따로 설정해주지 않았기 때문에 매개변수의 순서에 맞게 넣는게 아니다.

따라서 -3:10이 어떤 매개변수에 해당하는지 적어줘야한다. 

 

 

다수의 매개변수, 기본값 예시 

Ex6 = function(n, mu, sig, value = 0){
    set.seed(100)
    tmp = rnorm(n, mu, sig)
    
    if(min(tmp) > value){
        result = max(tmp) - min(tmp)
    } else {
        result = value - min(tmp)
    }
    
    return(result)
}
Ex6(4, 6, 3)
Ex6(4, 6, 3, 6)

 

 

 

연습하기 

 

최솟값 찾기

# Find minimum by function ---- 
my.min = function(x){
    mini = x[1]
    for (i in 1:length(x)){
        if (mini > x[i]){
            mini = x[i] 
        } else {
            mini = mini
        }
    }
    return(mini)
}

set.seed(100)
x = runif(100, 0, 30)
my.min(x)

 

코드 설명 

1. 첫 번째 값을 초기값으로 지정

2. 다음 값과 비교 후 더 작으면 그대로 유지

3. 만약 다음 값이 더 작을 경우 그 값으로 대체

4. 반복문을 이용하여 가장 작은 값 찾기 

 

unif >>> 균등분포

 

 

팩토리얼 

# Find Factorial 
my.fac = function(n) {
    if (n == 0) {
        n = 1
    } else{
        n = n * my.fac(n - 1)
    }
    return(n)
}

my.fac(8) == factorial(8)

 

사용자 정의 함수는 함수 안에서 사용자 정의 함수를  사용할 수 있다. 

ex) 

ft1 = function(x){n = n*ft1(n-1)} 

파이썬의 재귀함수를 생각하면 쉽게 이해할 수 있다. 

 

 

연습문제 

 

Q1 > f(x,y) = x^2 + y^2 

Q2 > x값이 주어졌을 때 x값이 양수이면 x를 출력하고 양수가 아니면 x의 절댓값을 출력하는 함수 

Q3 > n값이 주어졌을 때 N(5,2)에서 n개의 값을 뽑은 벡터의 최솟값과 최댓값의 합을 산출하는 함수 

 

# practice subject ----
# 1 ----
Q1 = function(x, y){
    return(x^2 + y^2)
}

# 2 ----
Q2 = function(x){
    if(x > 0){
        print(x)
    } else {
        print(abs(x))
    }
}

# 3 ----
Q3 = function(n){
    return(max(rnorm(n, 5, 2)) + min(rnorm(n, 5, 2)))
}

 

+ Recent posts