Стандартная оценка против нестандартной оценки в функции пакета R

Предполагается, что вызовы функций внутри функций R-пакета должны предпочтительно использовать стандартную оценку ( см. Здесь), особенно во избежание utils::globalVariables,

Если я использую стандартную оценку с пакетом dplyr, что будет "переводом" в стандартную оценку для следующего фрагмента кода - особенно для table-command?

grp а также dep являются числовыми значениями фрейма данных mydf, в то время как x это фактор.

Нестандартная оценка:

pvals <- mydf %>%
  dplyr::group_by(grp) %>%
  dplyr::summarise(N = n(),
    p = suppressWarnings(stats::chisq.test(table(x, dep))$p.value))

Стандартная оценка?

pvals <- mydf %>%
  dplyr::group_by_("grp") %>%
  dplyr::summarise_(N = n(),
    p = suppressWarnings(stats::chisq.test(table("x", "dep"))$p.value))

А как насчет вызовов функций с ggplot? Есть ли ggplot есть стандартная оценка поддержки?

Редактировать: Добавлен воспроизводимый пример.

library(dplyr)
data(ChickWeight)
ChickWeight %>%
  dplyr::group_by(Diet) %>%
  dplyr::summarise(N = n(),
  p = suppressWarnings(stats::chisq.test(table(weight, Time))$p.value))

1 ответ

Вы можете попытаться никогда не кодировать имена переменных внутри вашей функции и использовать rlang квазиквотация вместо.

Из вашего примера в контексте функции я бы написал:

#' Chisq table
#' @importFrom rlang enquo !!
#' @importFrom magrittr %>%
#'
#' @param data Dataset
#' @param x,y,group bare variable names
#' @export
chisq_table <- function(data, x, y, group){
  x <- enquo(x)
  y <- enquo(y)
  group <- enquo(group)

  data %>%
    dplyr::group_by(!!group) %>%
    dplyr::summarise(
      N = dplyr::n(),
      p = suppressWarnings(stats::chisq.test(table(!!x, !!y))$p.value)
    )
}

data(ChickWeight)
chisq_table(data = ChickWeight, x = weight, y = Time, group = Diet)

## # A tibble: 4 x 3
##   Diet      N        p
##  <fct> <int>    <dbl>
## 1 1       220 4.42e-16
## 2 2       120 3.76e- 7
## 3 3       120 4.74e- 6
## 4 4       118 1.33e- 5

Это не вызывает заметки при проверке пакета и упрощает поддержку ваших функций, если имена столбцов в ваших наборах данных меняются.

Если вы не хотите использовать dplyr, я бы просто проигнорировал ложное срабатывание codetools::checkUsagePackage().

Другие вопросы по тегам