[英]Standard Evaluation vs. Non-Standard Evaluation in R package function
建议在R-package函数内部的函数调用最好使用标准评估( 请参阅此处 ),尤其是避免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))
如果您不想使用dplyr,那么我将忽略codetools :: checkUsagePackage()的误报。
您可以尝试从不对函数中的变量名称进行硬编码,而应使用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
这在检查包时不会触发注释,并且如果数据集中的列名发生更改,则使维护功能更加容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.