R中的facet_grid()的tidy_eval inside labeller()函数

R中的facet_grid()的tidy_eval inside labeller()函数,r,ggplot2,R,Ggplot2,我之前发布了这个以及这个,这可能会给这个问题提供额外的背景 上下文数据: library(tidyverse) library(rlang) set.seed(1) dfr2 <- tibble(x1 = factor(sample(letters[1:3], 50, replace = T), levels=letters[1:3]), x2 = factor(sample(letters[1:2], 50, replace = T), levels=let

我之前发布了这个以及这个,这可能会给这个问题提供额外的背景

上下文数据:


library(tidyverse)
library(rlang)

set.seed(1)
dfr2 <- tibble(x1 = factor(sample(letters[1:3], 50, replace = T), levels=letters[1:3]),
             x2 = factor(sample(letters[1:2], 50, replace = T), levels=letters[1:2]),
             x3 = factor(sample(letters[1:3], 50, replace = T), levels=letters[1:3]),
             grpA = factor(sample(c("grp1","grp2"),50, prob=c(0.3, 0.7) ,replace=T), levels = c("grp1", "grp2")),
             grpB = factor(sample(c("grp1","grp2"),50, prob=c(0.6, 0.4) ,replace=T), levels = c("grp1", "grp2"))
             )

head(dfr2)



数据准备功能的正常使用:



plot_data_prepr(dat = dfr2, groupvar = "grpA", mainvar = "x1")



在下面的
labeller()
函数中,我必须显式键入
'grpA'
才能使代码正常工作。虽然这会产生具有适当标签的方面标签的预期结果,但这并不是我想要的,因为如果我要循环分组变量,它将阻止我动态更改分组变量:



for(mvar in names(dfr2)[1:3]) {
  
  smvar <- sym(mvar)
  
  gvar <- names(dfr2[4])
  sgvar <- sym(gvar)
  
  dd <- plot_data_prepr(dat = dfr2, groupvar = gvar, mainvar = mvar)

  lookup <- unique(dd$grp_tot)

  plusN <- function(string) {
    
    label <- paste0(string, ' (N = ',lookup,')')
    label
  }
  
    plot <- ggplot(dd, 
                   aes(x = !!smvar,y = pct2, fill = !!smvar)) +
      geom_bar(stat = 'identity') +
      ylim(0,1) +
      geom_text(aes(label=pct_lab, y = pct_pos + .02)) +
      facet_grid(as.formula(paste0(".~", gvar)), labeller = labeller(grpA = plusN))
      
    print(plot)
      
  }



也许有人能帮我解决我的问题


谢谢。

据我所知,解决问题的一种方法是使用
labeller
函数,因为
facet\u grid
将df传递给labeller函数,其中df的列名是facetting变量的名称。试试这个:

试试这个:

for(名称中的mvar(dfr2)[1:1]){
smvar


for(mvar in names(dfr2)[1:3]) {
  
  smvar <- sym(mvar)
  
  gvar <- names(dfr2[4])
  sgvar <- sym(gvar)
  
  dd <- plot_data_prepr(dat = dfr2, groupvar = gvar, mainvar = mvar)

  lookup <- unique(dd$grp_tot)

  plusN <- function(string) {
    
    label <- paste0(string, ' (N = ',lookup,')')
    label
  }
  
    plot <- ggplot(dd, 
                   aes(x = !!smvar,y = pct2, fill = !!smvar)) +
      geom_bar(stat = 'identity') +
      ylim(0,1) +
      geom_text(aes(label=pct_lab, y = pct_pos + .02)) +
      facet_grid(as.formula(paste0(".~", gvar)), labeller = labeller(grpA = plusN))
      
    print(plot)
      
  }




for(mvar in names(dfr2)[1:3]) {
  
  smvar <- sym(mvar)
  
  gvar <- names(dfr2[4])
  sgvar <- sym(gvar)
  
  dd <- plot_data_prepr(dat = dfr2, groupvar = gvar, mainvar = mvar)

  lookup <- unique(dd$grp_tot)

  plusN <- function(string) {
    
    enquo(string)
    
    label <- paste0(!!string, ' (N = ',lookup,')')
    label
  }
  
    plot <- ggplot(dd, 
                   aes(x = !!smvar,y = pct2, fill = !!smvar)) +
      geom_bar(stat = 'identity') +
      ylim(0,1) +
      geom_text(aes(label=pct_lab, y = pct_pos + .02)) +
      facet_grid(as.formula(paste0(".~", gvar)), labeller = labeller(gvar = plusN))
      
    print(plot)
      
  }