3

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

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

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

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

verb_现在不推荐使用这些函数,取而代之的是rlang库引入的新的 tidy 评估框架 (dplyr.tidyverse.org/articles/programming.html)。

dplyr0.7.0 开始,以下作品无需任何特殊调整:

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

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

动机

在闪亮的应用程序中选择列是一个很好的示例用例,这就是使用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)

    })
  }
)
4

2 回答 2

3

在 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

闪亮的比较

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

    })
  }
)
于 2017-05-13T17:17:14.290 回答
1

使用 dplyr 0.6,select()现在可以理解列名和列位置。以前它只会理解后者。所以你不再需要syms()了,因为这现在有效:select(mtcars, c("cyl", "disp"), "am").

于 2017-05-15T06:51:03.157 回答