Использование ранее существующих символьных векторов в квазиквотации выражения с 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"),

Другие вопросы по тегам