我正在尝试编写一个函数,其中参数之一是要进行换行的变量。
最小的可复制示例:
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”代替,后者是我调用该函数时的第二个参数。
有没有办法使这项工作成功?
答案 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")
答案 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")
答案 3 :(得分:0)
我认为解决您的问题的一个简单方法是使用[[
将列var
传递给您的函数:
wibble_fun <- function(df, var) {
df %>%
ggplot(aes(df[[var]])) +
geom_bar() +
facet_wrap(~df[[var]])
}
wibble_fun(wobble, "V1")