Мне часто приходится обращаться с векторами, которые могут содержать или не заполняться значениями NA
. Эти NAs
ожидаются и должны быть отброшены, что обычно обрабатывается большинством функций с помощью аргумента na.rm = TRUE
.
Однако иногда векторы будут полностью NA
, что приводит к неправильному поведению многих функций:
min(NA, na.rm = TRUE)
#> Warning in min(NA, na.rm = TRUE): no non-missing arguments to min; returning Inf
#> [1] Inf
Поэтому мне часто приходится разбирать этот случай отдельно.
Однако у меня есть пакет личных утилит, и мне пришло в голову, что я могу справиться с этим довольно легко с помощью функции-оболочки.
min.na <- function(..., .ifEmpty = NA) {
x <- na.omit(c(...))
if(length(x) == 0) return(.ifEmpty)
else return(min(x))
}
min.na(NA)
#> [1] NA
Но min
, очевидно, не единственная функция с таким типом поведения (если ничего иного, max
делает то же самое, очевидно).
Так что я подумал Лучше всего создать функцию генератора .FUN.na
, которая обрабатывает все функции одинаково, и извлечь из нее min.na
и max.na
:
.FUN.na <- function(FUN, ..ifEmpty = NA) {
return(
function(..., .ifEmpty = ..ifEmpty) {
x <- na.omit(c(...))
if(length(x) == 0) return(.ifEmpty)
else return(FUN(x))
}
)
}
#' @export
min.na <- .FUN.na(min)
#' @export
max.na <- .FUN.na(max)
Однако, когда я обновляю файл NAMESPACE и перестраиваю пакет , функции не экспортируются. Они добавляются в пакет и работают, но получить к ним доступ можно только через тройной двоеточие foo:::min.na()
.
Как я могу сделать их публично экспортированными?