将 select 与 quosures 一起使用
Using select with quosures
问题
我将如何使用 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
动词,但我想坚持使用一个系统以保持一致性。大多数东西很容易从一个 "universe" 转换为另一个,但我正在努力解决这个问题。
脚注
我知道有很多可能性可以解决这个问题。但是为了我的学习,我们假设 lkpq
是固定的并且不能更改。所以我真的很想知道如果某些元素不是基础数据的一部分,我如何使用 select
的 quosures 列表。
我们可以使用
quosSelect <- function(mdat) {
nm1 <- intersect(names(mdat), sapply(lkpq, quo_name))
mdat %>%
select(nm1)
}
quosSelect(mtcars)
quosSelect(iris)
问题
我将如何使用 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
动词,但我想坚持使用一个系统以保持一致性。大多数东西很容易从一个 "universe" 转换为另一个,但我正在努力解决这个问题。
脚注
我知道有很多可能性可以解决这个问题。但是为了我的学习,我们假设 lkpq
是固定的并且不能更改。所以我真的很想知道如果某些元素不是基础数据的一部分,我如何使用 select
的 quosures 列表。
我们可以使用
quosSelect <- function(mdat) {
nm1 <- intersect(names(mdat), sapply(lkpq, quo_name))
mdat %>%
select(nm1)
}
quosSelect(mtcars)
quosSelect(iris)