Я пытаюсь написать пользовательскую функцию, которая выполняет проверку на пригодность с использованием 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
и , а также выводить сообщение об ошибке, когда выражение не работает?