Использование ранее существующих символьных векторов в квазиквотации выражения с rlang
Иногда при работе с 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_
функции в настоящее время устарели в пользу новой структуры оценки аккуратности (dplyr.tidyverse.org/articles/programming.html), представленной rlang
библиотека.
По состоянию на dplyr
0.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)
})
}
)
2 ответа
В пред 0.5.0 dplyr
базовая основа для нестандартной оценки была lazyeval
и требует особого внимания к строкам. Хэдли Уикхем выпустила принципиально новую версию 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
фреймворк добавляет возможность иметь вектор обнаженных символов, используя каверсы
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))
})
}
)
С dplyr 0,6, select()
теперь понимает как имена столбцов, так и позиции столбцов. Раньше было бы понятно только последнее. Так что тебе не нужно syms()
больше, потому что это сейчас работает: select(mtcars, c("cyl", "disp"), "am")
,