【问题标题】:How to reference variable label in graph in R?如何在R中的图中引用变量标签?
【发布时间】:2021-10-05 12:40:16
【问题描述】:

您好,我在 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).

请帮忙!!只要我可以将其放入函数中,我也不介意有人有解决方法。

【问题讨论】:

    标签: r tidyverse rlang tidyeval r-haven


    【解决方案1】:

    我们可以在这里使用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)
    

    -输出

    【讨论】:

      【解决方案2】:

      在尝试使用{{}} 时,事情变得有些混乱。你可以这样做

      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))))
          )
      }
      

      【讨论】:

      • 我需要先运行 library(rlang) 才能运行,因为 quo_squash 是该软件包的一部分,它会抛出错误
      • 好点。我已经在命名空间中添加了。
      猜你喜欢
      • 2012-03-05
      • 2017-02-26
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多