ggplot和dplyr如何在函数中选择不带引号的变量

时间:2018-04-23 11:06:57

标签: r ggplot2 dplyr

ggplot2dplyr中,函数不需要引用变量的列名。以下是一些例子:

# A plot example
library(ggplot2)
ggplot(mtcars, aes(mpg, cyl)) +
  geom_point()


# A dplyr example
library(dplyr)
mtcars %>%
  select(cyl)

但是,如果我们尝试在函数中直接复制它,它会抱怨无法找到未查询的对象:

foo <- function(df, x){
   df %>%
    select(x)    
}

foo(mtcars, cyl)
  

FUN中的错误(X [[i]],...):找不到对象'cyl'

如何在我自己的函数中复制这些包的行为,以便添加不带引号的变量不会导致上述错误?

我知道我们可以在dplyr中使用下划线版本的函数来使用字符串,或在aes_string()中使用ggplot。例如:

foo2 <- function(df, x){    
  df %>%
    select_(x)      
}

foo(mtcars, "cyl")

我希望找到一种与这些包中的方式一致的解决方案。我在GitHub上看了一下源代码,但它只是增加了混乱。

1 个答案:

答案 0 :(得分:3)

您可以使用quosures来实现此目的。有关如何使用以及如何使用它的更多信息,请参阅this优秀文章

foo <- function(df, x){

    x <- enquo(x)

    df %>%
      select(!!x)    
}