结合使用选择和保证

时间:2018-07-03 12:01:28

标签: r dplyr rlang

问题

我将如何使用保兑措施?

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中使用量表。

1 个答案:

答案 0 :(得分:2)

我们可以使用

quosSelect <- function(mdat) {

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

quosSelect(mtcars) 
quosSelect(iris)