Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rlang::sym not recognized within label_bquote #4141

Closed
areisett opened this issue Jul 20, 2020 · 4 comments · Fixed by #4453
Closed

rlang::sym not recognized within label_bquote #4141

areisett opened this issue Jul 20, 2020 · 4 comments · Fixed by #4453
Labels
bug an unexpected problem or unintended behavior
Milestone

Comments

@areisett
Copy link

areisett commented Jul 20, 2020

I want to create facet labels dynamically. The labels come from a data frame and contain Greek letters. label_bquote alone fails to replace the Greek letter name stored in a variable with the symbol. Incorporating rlang::sym() around the variable names used to fix the issue, but now throws an error. However, this strategy still works when using bquote. The first piece of code below is from a solution to the stackoverflow post How can I make bquote replace the greek letter stored in a variable with the symbol?

### this works
library("tidyverse")

a <- "alpha"
b <- "beta"

ggplot(data.frame(x = c(1), y = c(1)), aes(x, y)) +
  geom_point() +
  labs(x = bquote(.(sym(a))[.(sym(b))])) +
  labs(y = bquote(alpha[beta]))

### this used to work, but now throws an error
library("tidyverse")
df <- data.frame(x = rep(1:5, 2), 
                 y = rnorm(10),
                 facet_var = rep(c("alpha", "beta"), times = c(5, 5)))

df
#>    x           y facet_var
#> 1  1 -1.14089312     alpha
#> 2  2  0.08233709     alpha
#> 3  3 -1.17177333     alpha
#> 4  4  1.00633917     alpha
#> 5  5 -0.01021232     alpha
#> 6  1 -1.48566764      beta
#> 7  2  0.32726416      beta
#> 8  3 -0.72468232      beta
#> 9  4  0.88635594      beta
#> 10 5  2.04821051      beta

ggplot(df, aes(x, y)) +
  geom_point() +
  facet_grid(facet_var ~ .,
             labeller = label_bquote(rows = .(sym(facet_var))))
#> Error in sym(facet_var): could not find function "sym"

### trying to be more explicit about sym doesn't seem to help
ggplot(df, aes(x, y)) +
  geom_point() +
  facet_grid(facet_var ~ .,
             labeller = label_bquote(rows = .(rlang::sym(facet_var))))
#> Error in rlang::sym: could not find function "::"

sessionInfo()
#> R version 4.0.2 (2020-06-22)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows 10 x64 (build 18362)
#> 
#> Matrix products: default
#> 
#> locale:
#> [1] LC_COLLATE=English_United States.1252 
#> [2] LC_CTYPE=English_United States.1252   
#> [3] LC_MONETARY=English_United States.1252
#> [4] LC_NUMERIC=C                          
#> [5] LC_TIME=English_United States.1252    
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] forcats_0.5.0   stringr_1.4.0   dplyr_0.8.5     purrr_0.3.4    
#> [5] readr_1.3.1     tidyr_1.1.0     tibble_3.0.1    ggplot2_3.3.0  
#> [9] tidyverse_1.3.0
#> 
#> loaded via a namespace (and not attached):
#>  [1] tidyselect_1.1.0 xfun_0.14        haven_2.3.0      lattice_0.20-41 
#>  [5] colorspace_1.4-1 vctrs_0.3.0      generics_0.0.2   htmltools_0.4.0 
#>  [9] yaml_2.2.1       blob_1.2.1       rlang_0.4.6      pillar_1.4.4    
#> [13] glue_1.4.0       withr_2.2.0      DBI_1.1.0        dbplyr_1.4.4    
#> [17] modelr_0.1.8     readxl_1.3.1     lifecycle_0.2.0  munsell_0.5.0   
#> [21] gtable_0.3.0     cellranger_1.1.0 rvest_0.3.5      evaluate_0.14   
#> [25] labeling_0.3     knitr_1.28       fansi_0.4.1      highr_0.8       
#> [29] broom_0.5.6      Rcpp_1.0.4.6     scales_1.1.1     backports_1.1.6 
#> [33] jsonlite_1.6.1   farver_2.0.3     fs_1.4.1         hms_0.5.3       
#> [37] digest_0.6.25    stringi_1.4.6    grid_4.0.2       cli_2.0.2       
#> [41] tools_4.0.2      magrittr_1.5     crayon_1.3.4     pkgconfig_2.0.3 
#> [45] ellipsis_0.3.0   xml2_1.3.2       reprex_0.3.0     lubridate_1.7.8 
#> [49] assertthat_0.2.1 rmarkdown_2.1    httr_1.4.1       R6_2.4.1        
#> [53] nlme_3.1-148     compiler_4.0.2

Created on 2020-07-20 by the reprex package (v0.3.0)

@yutannihilation
Copy link
Member

Thanks, confirmed. The problem is here; since params is supplied, bquote() only searches in params not in the other environments. Probably we should create an environment contains params instead of a list so that bquote() can search in the parent environments.

eval(substitute(bquote(expr, params), list(expr = quoted)))

@yutannihilation
Copy link
Member

Hmm, sorry. I don't know how to fix this properly atm...

Btw, I found another bug on label_bquote(). Maybe label_bquote() needs a major overhaul (I'm not sure if it's worth).

library(ggplot2)

df <- data.frame(x = 1:2, y = 1:2, f = c("alpha", "beta"))
p <- ggplot(df, aes(x, y)) + facet_wrap(~ f, labeller = label_bquote(.(f)))
p
#> Error in Map(f = function (...) : formal argument "f" matched by multiple actual arguments

@areisett
Copy link
Author

areisett commented Aug 4, 2020

Hmm... do you have any suggestions for a work-around?

@yutannihilation
Copy link
Member

For this particular example, you can use label_parsed()

@thomasp85 thomasp85 added the bug an unexpected problem or unintended behavior label Aug 31, 2020
@thomasp85 thomasp85 added this to the ggplot2 3.3.4 milestone Mar 25, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug an unexpected problem or unintended behavior
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants