如何在 R 中引用图中的变量标签?
How to reference variable label in graph in R?
您好,我在 R 中使用带有 haven 和 sjlabelled 包的标记数据。我想在绘制它时引用变量的标签。如果我直接引用数据框和标签(请参阅图表标题中的 get_label
函数),它会起作用。
library(sjlabelled)
library(tidyverse)
data(efc)
efc %>% get_label(c12hour, c161sex)
#> c12hour
#> "average number of hours of care per week"
#> c161sex
#> "carer's gender"
efc %>% ggplot() + geom_col(aes(c161sex, c12hour)) +
labs(
title = paste(get_label(efc, c12hour), "by", get_label(efc, c161sex))
)
#> Warning: Removed 7 rows containing missing values (position_stack).
但我无法让它在一个函数中工作。它没有认识到我对 tidy eval 的理解不足。
foo <- function(df, var1, var2) {
{{df}} %>% ggplot() + geom_col(aes({{var1}}, {{var2}})) +
labs(
title = paste(get_label({{df}}, {{var2}}), "by", get_label({{df}}, {{var1}}))
)
}
efc %>% foo(c161sex, c12hour)
#> 1 variables were not found in the dataset: {
#> {
#> var2
#> }
#> }
#> 1 variables were not found in the dataset: {
#> {
#> var1
#> }
#> }
#> Warning: Removed 7 rows containing missing values (position_stack).
请帮忙!!我也不介意是否有人有解决方法,只要我可以将其放入函数中即可。
这里我们可以用ensym
代替{{}}
foo <- function(df, var1, var2) {
var1 <- rlang::ensym(var1)
var2 <- rlang::ensym(var2)
df %>% ggplot() + geom_col(aes(!!var1, !!var2)) +
labs(
title = paste(get_label(df[[var2]]), "by", get_label(df[[var1]]))
)
}
-测试
efc %>%
foo(c161sex, c12hour)
-输出
尝试使用 {{}}
时,事情变得有点混乱。你可以做到
foo <- function(df, var1, var2) {
title <- eval(rlang::quo_squash(expr(paste(get_label(df, {{var2}}), "by", get_label(df, {{var1}})))))
df %>% ggplot() + geom_col(aes({{var1}}, {{var2}})) +
labs(
title = title
)
}
但实际上 {{}}
是获取符号然后将其注入表达式的捷径。如果您分别执行这两个步骤,在这种情况下会更容易
foo <- function(df, var1, var2) {
var1 <- rlang::ensym(var1)
var2 <- rlang::ensym(var2)
df %>% ggplot() + geom_col(aes(!!var1, !!var2)) +
labs(
title = eval(rlang::quo(paste(get_label(df, !!var2), "by", get_label(df, !!var1))))
)
}
您好,我在 R 中使用带有 haven 和 sjlabelled 包的标记数据。我想在绘制它时引用变量的标签。如果我直接引用数据框和标签(请参阅图表标题中的 get_label
函数),它会起作用。
library(sjlabelled)
library(tidyverse)
data(efc)
efc %>% get_label(c12hour, c161sex)
#> c12hour
#> "average number of hours of care per week"
#> c161sex
#> "carer's gender"
efc %>% ggplot() + geom_col(aes(c161sex, c12hour)) +
labs(
title = paste(get_label(efc, c12hour), "by", get_label(efc, c161sex))
)
#> Warning: Removed 7 rows containing missing values (position_stack).
foo <- function(df, var1, var2) {
{{df}} %>% ggplot() + geom_col(aes({{var1}}, {{var2}})) +
labs(
title = paste(get_label({{df}}, {{var2}}), "by", get_label({{df}}, {{var1}}))
)
}
efc %>% foo(c161sex, c12hour)
#> 1 variables were not found in the dataset: {
#> {
#> var2
#> }
#> }
#> 1 variables were not found in the dataset: {
#> {
#> var1
#> }
#> }
#> Warning: Removed 7 rows containing missing values (position_stack).
这里我们可以用ensym
代替{{}}
foo <- function(df, var1, var2) {
var1 <- rlang::ensym(var1)
var2 <- rlang::ensym(var2)
df %>% ggplot() + geom_col(aes(!!var1, !!var2)) +
labs(
title = paste(get_label(df[[var2]]), "by", get_label(df[[var1]]))
)
}
-测试
efc %>%
foo(c161sex, c12hour)
-输出
尝试使用 {{}}
时,事情变得有点混乱。你可以做到
foo <- function(df, var1, var2) {
title <- eval(rlang::quo_squash(expr(paste(get_label(df, {{var2}}), "by", get_label(df, {{var1}})))))
df %>% ggplot() + geom_col(aes({{var1}}, {{var2}})) +
labs(
title = title
)
}
但实际上 {{}}
是获取符号然后将其注入表达式的捷径。如果您分别执行这两个步骤,在这种情况下会更容易
foo <- function(df, var1, var2) {
var1 <- rlang::ensym(var1)
var2 <- rlang::ensym(var2)
df %>% ggplot() + geom_col(aes(!!var1, !!var2)) +
labs(
title = eval(rlang::quo(paste(get_label(df, !!var2), "by", get_label(df, !!var1))))
)
}