有时,在使用 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/