인수 확인

R 함수 작성 입문

Richie Cotton

Data Evangelist at DataCamp

기하평균

calc_geometric_mean <- function(x, na.rm = FALSE) {
  x %>%
    log() %>%
    mean(na.rm = na.rm) %>%
    exp()
}
calc_geometric_mean(letters)
Error in log(.) : 수치형이 아닌 인수가 수학 함수에 전달되었습니다
R 함수 작성 입문

수치형 여부 확인

calc_geometric_mean <- function(x, na.rm = FALSE) {

if(!is.numeric(x)) {
stop("x is not of class 'numeric'; it has class '", class(x), "'.")
}
x %>% log() %>% mean(na.rm = na.rm) %>% exp() }
Error in calc_geometric_mean(letters) : 
  x는 클래스 'numeric'이 아니며, 현재 클래스는 'character'입니다.
R 함수 작성 입문

assertive로 오류를 쉽게 처리

텍스트가 있는 shutterstock_743531290-with-text.jpg

R 함수 작성 입문

입력 타입 확인

  • assert_is_numeric()
  • assert_is_character()
  • is_data.frame()
  • ...
  • is_two_sided_formula()
  • is_tskernel()
R 함수 작성 입문

assertive로 x 확인

calc_geometric_mean <- function(x, na.rm = FALSE) {

assert_is_numeric(x)
x %>% log() %>% mean(na.rm = na.rm) %>% exp() }
 Error in calc_geometric_mean(letters) : 
  is_numeric : x는 클래스 'numeric'이 아니며, 현재 클래스는 'character'입니다.
R 함수 작성 입문

x가 양수인지 확인

calc_geometric_mean <- function(x, na.rm = FALSE) {
  assert_is_numeric(x)

assert_all_are_positive(x)
x %>% log() %>% mean(na.rm = na.rm) %>% exp() }
calc_geometric_mean(c(1, -1))
Error in calc_geometric_mean(c(1, -1)) :
  is_positive : x에 음수 또는 0이 있습니다.
There was 1 failure:
  Position Value   Cause
1        2    -1 too low
R 함수 작성 입문

is_* 함수

  • assert_is_numeric()
  • assert_all_are_positive()
  • is_numeric() (논리값 반환)
  • is_positive() (논리 벡터 반환)
  • is_non_positive()
R 함수 작성 입문

사용자 정의 확인

calc_geometric_mean <- function(x, na.rm = FALSE) {
  assert_is_numeric(x)

if(any(is_non_positive(x), na.rm = TRUE)) { stop("x contains non-positive values, so the geometric mean makes no sense.") }
x %>% log() %>% mean(na.rm = na.rm) %>% exp() }
calc_geometric_mean(c(1, -1))
Error in calc_geometric_mean(c(1, -1)) : 
  x에 음수 또는 0이 있어 기하평균이 의미가 없습니다.
R 함수 작성 입문

입력 보정

use_first(c(1, 4, 9, 16))
[1] 1
Warning message:
첫 번째 값 c(1, 4, 9, 16) (= 1)만 사용됩니다.
coerce_to(c(1, 4, 9, 16), "character")
[1] "1"  "4"  "9"  "16"
Warning message:
c(1, 4, 9, 16)를 클래스 ‘character’로 강제 변환합니다.
R 함수 작성 입문

na.rm 보정

calc_geometric_mean <- function(x, na.rm = FALSE) {
  assert_is_numeric(x)
  if(any(is_non_positive(x), na.rm = TRUE)) {
    stop("x contains non-positive values, so the geometric mean makes no sense.")
  }

na.rm <- coerce_to(use_first(na.rm), target_class = "logical")
x %>% log() %>% mean(na.rm = na.rm) %>% exp() }
calc_geometric_mean(1:5, na.rm = 1:5)
[1] 2.605171
Warning messages:
1: na.rm의 첫 번째 값(= 1)만 사용됩니다. 
2: use_first(na.rm)을 클래스 ‘logical’로 강제 변환합니다.
R 함수 작성 입문

연습해 봅시다!

R 함수 작성 입문

Preparing Video For Download...