代码之家  ›  专栏  ›  技术社区  ›  thothal

使用带配额的Select

  •  4
  • thothal  · 技术社区  · 6 年前

    问题

    如何使用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 如果某些元素不是基础数据的一部分。

    1 回复  |  直到 6 年前
        1
  •  2
  •   akrun    6 年前

    我们可以用

    quosSelect <- function(mdat) {
    
      nm1 <- intersect(names(mdat), sapply(lkpq, quo_name))
      mdat %>% 
              select(nm1)
      }
    
    quosSelect(mtcars) 
    quosSelect(iris)