Использование select с квазурами

Вопрос

Как бы я сделал следующее, используя quosures?

library(tidyverse)
lkp <- c("am", "vs", "Sepal.Width", "Sepal.Length")
stringSelect <- function(mdat) {
   lkpOK <- intersect(lkp, names(mdat))
   mdat %>% select(one_of(lkpOK))
}
stringSelect(mtcars)
stringSelect(iris)

Итак, как я могу подмножить lkpq ниже, чтобы добиться того же самого с quos, чтобы избежать предупреждения?

lkpq <- quos(am, vs, Sepal.Width, Sepal.Length)
quosSelect <- function(mdat) {
   lkpqOK <- lkpq ##???
   mdat %>% select(!!!lkpqOK)
}
quosSelect(mtcars) ## does not work
quosSelect(iris)

Контекст

В своем приложении я смешиваю традиционные селекторы R и tidyverse глаголы, но я хочу придерживаться одной системы для согласованности. Большинство вещей легко перевести из одной «вселенной» в другую, но я борюсь с этим.


Сноска

Я знаю, что есть много возможностей решить эту проблему. Но ради моего обучения давайте предположим, что lkpq фиксировано и не может быть изменено. Поэтому мне действительно интересно узнать, как я могу использовать список квазур с select, если некоторые элементы не являются частью базовых данных.


person thothal    schedule 03.07.2018    source источник


Ответы (1)


Мы можем использовать

quosSelect <- function(mdat) {

  nm1 <- intersect(names(mdat), sapply(lkpq, quo_name))
  mdat %>% 
          select(nm1)
  }

quosSelect(mtcars) 
quosSelect(iris)
person akrun    schedule 03.07.2018
comment
Хорошо, преобразование quosure обратно в строку, конечно, правильное решение +1. Хотя чувствует себя немного хакерским. Или моя проблема не для quo? - person thothal; 03.07.2018
comment
@thothal Вы сказали, что решение работает с предупреждением. Но я не могу заставить его работать. Я использовал dplyr_0.7.5 и rlang_0.2.1 Какие у вас версии пакетов - person akrun; 03.07.2018
comment
Хм, забавно, начиная со свежей сессии у меня тоже ошибка. Теперь не знаю, почему это сработало между ними. Я обновлю свой пост. Благодарю. - person thothal; 03.07.2018
comment
@thothal это может быть связано с некоторыми переменными, которые вы создали в предыдущем сеансе. понятия не имею об этом - person akrun; 03.07.2018