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

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

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

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))

person Daniel    schedule 28.02.2016    source источник
comment
Почему бы вам не использовать один из встроенных наборов данных для вашего примера, чтобы его можно было легко воспроизвести?   -  person talat    schedule 28.02.2016


Ответы (2)


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

person Florian    schedule 28.02.2016
comment
Я также хотел бы знать, если использование стандартной оценки - лучшая привычка, когда ее использовать? У меня есть несколько вызовов функций для ggplot, где я не могу использовать стандартную оценку и должен использовать globalVariables, чтобы мой пакет прошел проверку R CMD. - person Daniel; 28.02.2016
comment
Я бы просто использовал проверку R CMD, если вы получите положительный результат, вы можете исправить это с помощью внутри -r.org/r-doc/utils/globalVariables, но я никогда не сталкивался с этой проблемой. - person Florian; 28.02.2016
comment
Что касается стандартного и нестандартного, x <- data.frame(a=1:4, b=5:8), если вы хотите упорядочить его по обоим столбцам, вы можете сделать order(x$a, x$b) или with(x, order(a, b)), он будет работать в обоих, второй может быть во многих случаях более читабельным и менее типичным. Но если R CMD проверяет, все ли ваши переменные определены, вы миграция не проверяет, что вы находитесь в пределах с, и дает ложное срабатывание. - person Florian; 28.02.2016
comment
Поэтому я бы сказал, что лучшая привычка - это то, что вам удобнее для чтения! А функция globalVariables - это просто способ справиться с ложным срабатыванием, что мне кажется нормальным. - person Florian; 28.02.2016

Вы можете попробовать никогда не жестко кодировать имена переменных в своей функции и использовать 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

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

person Romain    schedule 28.02.2019