использование `tryCatch` и вывод сообщения об ошибке при неудачном выражении - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь написать пользовательскую функцию, которая выполняет проверку на пригодность с использованием chisq.test (ниже - ее игрушечная версия). Я хочу, чтобы функция была устойчивой, поэтому я использую tryCatch, чтобы убедиться, что если указаны недопустимые векторы вероятности, функция возвращает фрейм данных с NaN s.

Вот функция-

set.seed(123)

# custom function
custom_prop <- function(var, ratio) {
  tryCatch(
    expr = broom::tidy(stats::chisq.test(
      x = table(var),
      p = ratio
    )),
    error = function(x) {
      tibble::tribble(
        ~statistic, ~p.value, ~parameter,
        NaN, NaN, NaN
      )
    }
  )
}

проверка правильных соотношений (векторные суммы равны 1; работает как положено)

custom_prop(mtcars$am, c(0.6, 0.4))
#> # A tibble: 1 x 4
#>   statistic p.value parameter method                                  
#>       <dbl>   <dbl>     <dbl> <chr>                                   
#> 1   0.00521   0.942         1 Chi-squared test for given probabilities

custom_prop(mtcars$am, c(0.7, 0.3))
#> # A tibble: 1 x 4
#>   statistic p.value parameter method                                  
#>       <dbl>   <dbl>     <dbl> <chr>                                   
#> 1      1.72   0.190         1 Chi-squared test for given probabilities

проверка неверных соотношений (вектор не равен 1; работает как положено)

custom_prop(mtcars$am, c(0.6, 0.6))
#> # A tibble: 1 x 3
#>   statistic p.value parameter
#>       <dbl>   <dbl>     <dbl>
#> 1       NaN     NaN       NaN

custom_prop(mtcars$am, c(0.7, 0.5))
#> # A tibble: 1 x 3
#>   statistic p.value parameter
#>       <dbl>   <dbl>     <dbl>
#> 1       NaN     NaN       NaN

Но проблема этого подхода заключается в том, что пользователь не имеет ни малейшего представления, почему функция не возвращала результаты. Если бы я не использовал tryCatch, они поймут, почему-

broom::tidy(stats::chisq.test(
  x = table(mtcars$am),
  p = c(0.7,0.5)
))
#> Error in stats::chisq.test(x = table(mtcars$am), p = c(0.7, 0.5)): probabilities must sum to 1.

Я также попробовал упомянутое решение здесь , но это просто возвращает NULL без вывода сообщения об ошибке -

# custom function
custom_prop2 <- function(var, ratio) {
  tryCatch(
    expr = broom::tidy(stats::chisq.test(
      x = table(var),
      p = ratio
    )),
    error = function(e) {}
  )
}

# trying out invalid ratios
custom_prop2(mtcars$am, c(0.6, 0.6))
#> NULL

Итак, мой вопрос -
Есть ли способ использовать tryCatch и , а также выводить сообщение об ошибке, когда выражение не работает?

1 Ответ

5 голосов
/ 24 июня 2019

Просто используйте сообщение об ошибке, чтобы создать и выдать warning вместо:

custom_prop <- function(var, ratio) {
  tryCatch(
    expr = broom::tidy(stats::chisq.test(
      x = table(var),
      p = ratio
    )),
    error = function(x) {
      warning(x)   # just add this line
      tibble::tribble(
        ~statistic, ~p.value, ~parameter,
        NaN, NaN, NaN
      )
    }
  )
}

custom_prop(mtcars$am, c(0.6, 0.6))
# A tibble: 1 x 3
#  statistic p.value parameter
#      <dbl>   <dbl>     <dbl>
#1       NaN     NaN       NaN
#Warning message:
#In stats::chisq.test(x = table(var), p = ratio) :
#  probabilities must sum to 1.
...