r - 在 rlang 表达式的准引用中使用预先存在的字符向量

标签 r dplyr rlang tidyeval

有时,在使用 dplyr 时,会有一个列名称的字符向量,用于对数据进行操作,例如:

 cols_of_interest <- c("Petal.Width", "Petal.Length")

dplyr 0.5.0 及更早版本中,解决此问题的推荐方法是使用 verb_ 下划线结构,如下所示:

library("tidyverse")
my_cols <- c("Petal.Width", "Petal.Length")
iris %>%
  select_(.dots = my_cols)

现在已弃用 verb_ 函数,取而代之的是 rlang 库引入的新的整洁评估框架 (dplyr.tidyverse.org/articles/programming.html)。

dplyr 0.7.0 开始,以下内容无需任何特殊调整即可工作:

library("tidyverse")
# library("rlang")
my_cols <- c("Petal.Width", "Petal.Length")
iris %>%
  select(my_cols)

请注意,在 dplyr 的开发版本中,情况并非如此

动机

在 Shiny 的应用程序中选择列是一个很好的示例用例,这就是如何使用 verb_ 表示法来做到这一点

library("shiny")
library("tidyverse")
library("DT")

shinyApp(
  ui = fluidPage(
    selectInput("cols_to_show",
                "Columns to show",
                choices = colnames(iris),
                multiple = TRUE),
    dataTableOutput("verb_table")
  ),
  server = function(input, output){
    output$verb_table <- renderDataTable({
      iris %>%
        select_(.dots = input$cols_to_show)

    })
  }
)

最佳答案

在 0.5.0 之前的 dplyr 中,非标准评估的底层框架是 lazyeval 并且需要对字符串进行特殊考虑。 Hadley Wickham 发布了 dplyr 的全新版本,其中有一个名为 rlang 的新弱点,它为非标准评估提供了更一致的框架。这是版本 0.70 - 这里解释了为什么跳过 0.6.0 - https://blog.rstudio.org/2017/06/13/dplyr-0-7-0/

以下内容现在无需任何特殊考虑即可运行:

library("tidyverse")
my_cols <- c("Petal.Width", "Petal.Length")
iris %>%
  select(my_cols)

请注意,新的 rlang 框架添加了使用 quosures 获得裸符号向量的能力

my_quos <- quos(Petal.Width, Petal.Length)
iris %>%
  select(!!!my_quos)

您可以在此处阅读有关使用 dplyr 进行编程的更多信息 - http://dplyr.tidyverse.org/articles/programming.html

Shiny 比较

library("shiny")
library("tidyverse")
library("DT")
library("rlang")
shinyApp(
  ui = fluidPage(
    selectInput(
      "cols_to_show",
      "Columns to show",
      choices = colnames(iris),
      multiple = TRUE
    ),
    dataTableOutput("verb_table"),
    dataTableOutput("tidyeval_table")
  ),
  server = function(input, output) {
    output$verb_table <- renderDataTable({
      iris %>%
        select_(.dots = input$cols_to_show)

    })

    output$tidyeval_table <- renderDataTable({
      iris %>%
        select(!!!syms(input$cols_to_show))

    })
  }
)

关于r - 在 rlang 表达式的准引用中使用预先存在的字符向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43955905/

相关文章:

r - 如何使用 R markdown 和 pandoc 防止在 LaTeX 文档中转义〜(波浪号)字符?

r - Julia 相当于 dplyr 的 bind_cols 和 bind_rows

r - 在 dplyr 中确定分组数据框中最频繁因素的最快方法

r - 使用具有 mutate 函数的多个字符串的向量进行 Dplyr 标准评估

从 dplyr 中的变量中引用列名

r - 使用 rlang 包解析引用参数

r - 不同大小矩阵的相同内存使用

r - 从 plm 模型中提取各个系数 (R)

r - 如何在 ggplot2 中以对数刻度显示 stat_binhex

r - 有没有办法使用 dplyr 根据除以另一列的 group_by 来创建新列?