Стандартная оценка против нестандартной оценки в функции пакета 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().