2

建议,R-package 函数内部的函数调用最好使用标准评估(见这里),尤其是避免utils::globalVariables.

如果我对dplyr包使用非标准评估,那么以下代码片段的标准评估的“翻译”是什么 - 特别是对于table-command?

grpdep是数据框的数值mydfx而是一个因素。

非标评价:

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

2 回答 2

1

您可以尝试永远不要对函数中的变量名称进行硬编码,而是使用rlang quasiquotation

从您的示例中,在函数上下文中,我会写:

#' 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

这不会在检查包时触发注释,并且如果数据集中的列名发生更改,则可以更轻松地维护函数。

于 2019-02-28T12:46:44.683 回答
0

如果您不想使用 dplyr,我会忽略 codetools::checkUsagePackage() 的误报。

于 2016-02-28T12:56:27.847 回答