非准引用上下文中的 Tidyeval (psych::describeBy(group))

Tidyeval in a non-quasiquotation context (psych::describeBy(group))

我正在尝试创建一个函数,它将 return 一个 gt table 公共 psych::describe()psych::describeBy() 函数的结果。

问题是 describeBy() 期望组参数的形式为 data$vector 而不仅仅是 group = vector.

所以

describeBy(data, data$group) 
# works

describeBy(data, group)
# doesn't work

这对于一般用途来说很好——只是要记住。 但是要在闪亮的应用程序中使用它,我真的需要它采用上面第二次调用的形式。

到目前为止,这是我的功能:

description<-function(data, group = NULL, fast = TRUE, ...) {
  grp<-paste0(deparse(substitute(group)))
  #print(grp)
  
  
    if(is.null(group)) {
      data %>%
        psych::describe(fast = fast, ...) %>%
        tibble::rownames_to_column() %>%
        dplyr::select(-c(vars)) %>%
        dplyr::mutate(dplyr::across(is.numeric, round, 2)) %>%
        gt::gt() %>%
        gt::tab_options(
          column_labels.font.size = "small",
          table.font.size = "small",
          row_group.font.size = "small",
          data_row.padding = px(3)
        ) %>% 
        tab_header(
          title = paste0("Data Description") 
        )
    } else {
      data %>%
        psych::describeBy(group = group, fast = fast, mat= TRUE, ...) %>%
        tibble::rownames_to_column() %>%
        select(-c(item, vars)) %>%
        dplyr::mutate(dplyr::across(is.numeric, round, 2)) %>%
        arrange(group1) %>%
        group_by(group1) %>%
        gt() %>%
        gt::tab_options(
          column_labels.font.size = "small",
          table.font.size = "small",
          row_group.font.size = "small",
          data_row.padding = px(3))
    } %>% 
    tab_header(
      title = paste0("Data Description") ,
      subtitle = paste0("Grouped by: ",  grp )
    )
}

我在 group = 调用中尝试了很多关于 enquo、names()、!! 等的变体,但我不能完全让它正常工作。有人可以帮忙吗?

psych::describeBy 不包含数据参数。因此,您不能直接从数据中使用 group。如果你需要使用它,你最好使用公式选项。例如:

psych::describeBy(iris~Species)

如果您要编写一个函数,那么请执行以下操作:

my_describe <- function(data, group = NULL, fast = TRUE){
  if(deparse(substitute(group)) == 'NULL')
    psych::describe(data)
  else  psych::describeBy(as.formula(substitute(data~group)))
}

注意:请注意最好的方法,但它确实有效