ggplot方面包装变量作为函数中的参数

时间:2019-03-21 23:54:19

标签: r ggplot2

我正在尝试编写一个函数,其中参数之一是要进行换行的变量。

最小的可复制示例:

library(tidyverse)
library(ggplot2)

wobble<- matrix(1:9, 3) %>% as_tibble()


wibble_fun <- function(df, var) {
   df %>%
     ggplot(aes(var)) +
     geom_bar() + 
     facet_wrap(~var)
}


wibble_fun(wobble, "V1")

产生的错误:

Error: At least one layer must contain all faceting variables: `var`.
* Plot is missing `var`
* Layer 1 is missing `

好像var中的facet_wrap(~var)被解释为字符串'var'而不是被“ V1”代替,后者是我调用该函数时的第二个参数。

有没有办法使这项工作成功?

4 个答案:

答案 0 :(得分:2)

以下是在函数内的变量周围使用 {{...}} 而不是使用 sym 和 unqoting 的解决方案:

library(tidyverse)
library(ggplot2)

wobble<- matrix(1:9, 3) %>% as_tibble()


wibble_fun <- function(df, var) {
   df %>%
     ggplot(aes({{var}})) +
     geom_bar() + 
     facet_wrap(vars({{var}}))
}


wibble_fun(wobble, V1)

答案 1 :(得分:0)

技巧是将V1中的df重命名为var

library(tidyverse)
library(ggplot2)
wobble <- matrix(1:9, 3) %>% as_tibble()   

wibble_fun <- function(df, var) {
   df %>%
   rename(var=!!var) %>%
     ggplot(aes(var)) +
     geom_bar() + 
     facet_wrap(~var) +
     xlab(var)
}

wibble_fun(wobble, "V1")

enter image description here

答案 2 :(得分:0)

执行此操作的另一种方法是使用非标准评估,该评估虽然令人困惑,但却是在tidyverse中执行此类操作的“官方”方式。

我们使用sym函数将var从字符串转换为symbol,然后在!!中用aes取消引用。

对于facet_wrap:正如marius在注释中指出的那样,facet_wrap可以接受字符串或符号而不是公式(由~构成)。您可以传入符号x或字符串var本身:您将获得相同的结果。

library(tidyverse)
library(ggplot2)

wobble<- matrix(1:9, 3) %>% as_tibble()


wibble_fun <- function(df, var) {
    x = sym(var)
    df %>%
        ggplot(aes(!!x)) +
        geom_bar() + 
        facet_wrap(x)
}


wibble_fun(wobble, "V1")

Plot

答案 3 :(得分:0)

我认为解决您的问题的一个简单方法是使用[[将列var传递给您的函数:

    wibble_fun <- function(df, var) {
     df %>%
     ggplot(aes(df[[var]])) +
     geom_bar() + 
     facet_wrap(~df[[var]])
}


wibble_fun(wobble, "V1")