ggplot facet wrap 变量作为函数中的参数

fie*_*lla 6 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")
Run Code Online (Sandbox Code Playgroud)

由此产生的错误:

Error: At least one layer must contain all faceting variables: `var`.
* Plot is missing `var`
* Layer 1 is missing `
Run Code Online (Sandbox Code Playgroud)

似乎varinfacet_wrap(~var)被解释为字符串“var”,而不是被“V1”替换,这是我调用函数时的第二个参数。

有没有办法使这项工作?

mgr*_*und 8

{{...}}这是在函数内使用变量而不是使用和取消引用的解决方案sym

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)
Run Code Online (Sandbox Code Playgroud)


Mar*_*dri 0

诀窍是将重命名V1为:dfvar

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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述