Consider this basic ggplot2 example:
library(ggplot2)
packageVersion("ggplot2")
#> [1] '3.4.0'
ggplot(mpg, aes(displ))
geom_histogram(aes(y = ..density..))
#> Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
#> ℹ Please use `after_stat(density)` instead.
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
The dot dot notation is deprecated. So I tried the following, as recommended:
ggplot(mpg, aes(displ))
geom_histogram(aes(y = after_stat(density)))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
But within a pacakge this produces an R CMD check no visible binding note:
#> nice_density: no visible binding for global variable 'density'.
Now I know it’s possible to define global variables with utils::globalVariables
or define as NULL
earlier, but I understand that these are not the preferred solution. So here are my various attempts:
ggplot(mpg, aes(displ))
geom_histogram(aes(y = after_stat(stats::density)))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#> Error in `geom_histogram()`:
#> ! Problem while mapping stat to aesthetics.
#> ℹ Error occurred in the 1st layer.
#> Caused by error in `map_statistic()`:
#> ! Aesthetics must be valid computed stats.
#> ✖ The following aesthetics are invalid:
#> ✖ `y = after_stat(stats::density)`
#> ℹ Did you map your stat in the wrong layer?
#> Backtrace:
#> ▆
#> 1. ├─base::tryCatch(...)
#> 2. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 3. │ ├─base (local) tryCatchOne(...)
#> 4. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 5. │ └─base (local) tryCatchList(expr, names[-nh], parentenv, handlers[-nh])
#> 6. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 7. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 8. ├─base::withCallingHandlers(...)
#> 9. ├─base::saveRDS(...)
#> 10. ├─base::do.call(...)
#> 11. ├─base (local) `<fn>`(...)
#> 12. └─global `<fn>`(input = base::quote("waspy-bunny_reprex.R"))
#> 13. └─rmarkdown::render(input, quiet = TRUE, envir = globalenv(), encoding = "UTF-8")
#> 14. └─knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet)
#> 15. └─knitr:::process_file(text, output)
#> 16. ├─base::withCallingHandlers(...)
#> 17. ├─knitr:::process_group(group)
#> 18. └─knitr:::process_group.block(group)
#> 19. └─knitr:::call_block(x)
#> 20. └─knitr:::block_exec(params)
#> 21. └─knitr:::eng_r(options)
#> 22. ├─knitr:::in_input_dir(...)
#> 23. │ └─knitr:::in_dir(input_dir(), expr)
#> 24. └─knitr (local) evaluate(...)
#> 25. └─evaluate::evaluate(...)
#> 26. └─evaluate:::evaluate_call(...)
#> 27. ├─evaluate (local) handle(...)
#> 28. │ └─base::try(f, silent = TRUE)
#> 29. │ └─base::tryCatch(...)
#> 30. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 31. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 32. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 33. ├─base::withCallingHandlers(...)
#> 34. ├─base::withVisible(value_fun(ev$value, ev$visible))
#> 35. └─knitr (local) value_fun(ev$value, ev$visible)
#> 36. └─knitr (local) fun(x, options = options)
#> 37. ├─base::withVisible(knit_print(x, ...))
#> 38. ├─knitr::knit_print(x, ...)
#> 39. └─knitr:::knit_print.default(x, ...)
#> 40. └─evaluate (local) normal_print(x)
#> 41. ├─base::print(x)
#> 42. └─ggplot2:::print.ggplot(x)
#> 43. ├─ggplot2::ggplot_build(x)
#> 44. └─ggplot2:::ggplot_build.ggplot(x)
#> 45. └─ggplot2:::by_layer(...)
#> 46. ├─rlang::try_fetch(...)
#> 47. │ ├─base::tryCatch(...)
#> 48. │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 49. │ │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 50. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 51. │ └─base::withCallingHandlers(...)
#> 52. └─ggplot2 (local) f(l = layers[[i]], d = data[[i]])
#> 53. └─l$map_statistic(d, plot)
#> 54. └─ggplot2 (local) map_statistic(..., self = self)
#> 55. └─cli::cli_abort(...)
#> 56. └─rlang::abort(...)
ggplot(mpg, aes(displ))
geom_histogram(aes_string(y = after_stat("density")))
#> Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
#> ℹ Please use tidy evaluation ideoms with `aes()`
#> Don't know how to automatically pick scale for object of type <function>.
#> Defaulting to continuous.
#> Error in `geom_histogram()`:
#> ! Problem while computing aesthetics.
#> ℹ Error occurred in the 1st layer.
#> Caused by error in `compute_aesthetics()`:
#> ! Aesthetics are not valid data columns.
#> ✖ The following aesthetics are invalid:
#> ✖ `y = density`
#> ℹ Did you mistype the name of a data column or forget to add `after_stat()`?
#> Backtrace:
#> ▆
#> 1. ├─base::tryCatch(...)
#> 2. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 3. │ ├─base (local) tryCatchOne(...)
#> 4. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 5. │ └─base (local) tryCatchList(expr, names[-nh], parentenv, handlers[-nh])
#> 6. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 7. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 8. ├─base::withCallingHandlers(...)
#> 9. ├─base::saveRDS(...)
#> 10. ├─base::do.call(...)
#> 11. ├─base (local) `<fn>`(...)
#> 12. └─global `<fn>`(input = base::quote("waspy-bunny_reprex.R"))
#> 13. └─rmarkdown::render(input, quiet = TRUE, envir = globalenv(), encoding = "UTF-8")
#> 14. └─knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet)
#> 15. └─knitr:::process_file(text, output)
#> 16. ├─base::withCallingHandlers(...)
#> 17. ├─knitr:::process_group(group)
#> 18. └─knitr:::process_group.block(group)
#> 19. └─knitr:::call_block(x)
#> 20. └─knitr:::block_exec(params)
#> 21. └─knitr:::eng_r(options)
#> 22. ├─knitr:::in_input_dir(...)
#> 23. │ └─knitr:::in_dir(input_dir(), expr)
#> 24. └─knitr (local) evaluate(...)
#> 25. └─evaluate::evaluate(...)
#> 26. └─evaluate:::evaluate_call(...)
#> 27. ├─evaluate (local) handle(...)
#> 28. │ └─base::try(f, silent = TRUE)
#> 29. │ └─base::tryCatch(...)
#> 30. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 31. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 32. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 33. ├─base::withCallingHandlers(...)
#> 34. ├─base::withVisible(value_fun(ev$value, ev$visible))
#> 35. └─knitr (local) value_fun(ev$value, ev$visible)
#> 36. └─knitr (local) fun(x, options = options)
#> 37. ├─base::withVisible(knit_print(x, ...))
#> 38. ├─knitr::knit_print(x, ...)
#> 39. └─knitr:::knit_print.default(x, ...)
#> 40. └─evaluate (local) normal_print(x)
#> 41. ├─base::print(x)
#> 42. └─ggplot2:::print.ggplot(x)
#> 43. ├─ggplot2::ggplot_build(x)
#> 44. └─ggplot2:::ggplot_build.ggplot(x)
#> 45. └─ggplot2:::by_layer(...)
#> 46. ├─rlang::try_fetch(...)
#> 47. │ ├─base::tryCatch(...)
#> 48. │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 49. │ │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 50. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 51. │ └─base::withCallingHandlers(...)
#> 52. └─ggplot2 (local) f(l = layers[[i]], d = data[[i]])
#> 53. └─l$compute_aesthetics(d, plot)
#> 54. └─ggplot2 (local) compute_aesthetics(..., self = self)
#> 55. └─cli::cli_abort(...)
#> 56. └─rlang::abort(...)
ggplot(mpg, aes(displ))
geom_histogram(aes_string(y = "density"))
#> Don't know how to automatically pick scale for object of type <function>.
#> Defaulting to continuous.
#> Error in `geom_histogram()`:
#> ! Problem while computing aesthetics.
#> ℹ Error occurred in the 1st layer.
#> Caused by error in `compute_aesthetics()`:
#> ! Aesthetics are not valid data columns.
#> ✖ The following aesthetics are invalid:
#> ✖ `y = density`
#> ℹ Did you mistype the name of a data column or forget to add `after_stat()`?
#> Backtrace:
#> ▆
#> 1. ├─base::tryCatch(...)
#> 2. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 3. │ ├─base (local) tryCatchOne(...)
#> 4. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 5. │ └─base (local) tryCatchList(expr, names[-nh], parentenv, handlers[-nh])
#> 6. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 7. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 8. ├─base::withCallingHandlers(...)
#> 9. ├─base::saveRDS(...)
#> 10. ├─base::do.call(...)
#> 11. ├─base (local) `<fn>`(...)
#> 12. └─global `<fn>`(input = base::quote("waspy-bunny_reprex.R"))
#> 13. └─rmarkdown::render(input, quiet = TRUE, envir = globalenv(), encoding = "UTF-8")
#> 14. └─knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet)
#> 15. └─knitr:::process_file(text, output)
#> 16. ├─base::withCallingHandlers(...)
#> 17. ├─knitr:::process_group(group)
#> 18. └─knitr:::process_group.block(group)
#> 19. └─knitr:::call_block(x)
#> 20. └─knitr:::block_exec(params)
#> 21. └─knitr:::eng_r(options)
#> 22. ├─knitr:::in_input_dir(...)
#> 23. │ └─knitr:::in_dir(input_dir(), expr)
#> 24. └─knitr (local) evaluate(...)
#> 25. └─evaluate::evaluate(...)
#> 26. └─evaluate:::evaluate_call(...)
#> 27. ├─evaluate (local) handle(...)
#> 28. │ └─base::try(f, silent = TRUE)
#> 29. │ └─base::tryCatch(...)
#> 30. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 31. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 32. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 33. ├─base::withCallingHandlers(...)
#> 34. ├─base::withVisible(value_fun(ev$value, ev$visible))
#> 35. └─knitr (local) value_fun(ev$value, ev$visible)
#> 36. └─knitr (local) fun(x, options = options)
#> 37. ├─base::withVisible(knit_print(x, ...))
#> 38. ├─knitr::knit_print(x, ...)
#> 39. └─knitr:::knit_print.default(x, ...)
#> 40. └─evaluate (local) normal_print(x)
#> 41. ├─base::print(x)
#> 42. └─ggplot2:::print.ggplot(x)
#> 43. ├─ggplot2::ggplot_build(x)
#> 44. └─ggplot2:::ggplot_build.ggplot(x)
#> 45. └─ggplot2:::by_layer(...)
#> 46. ├─rlang::try_fetch(...)
#> 47. │ ├─base::tryCatch(...)
#> 48. │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 49. │ │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 50. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 51. │ └─base::withCallingHandlers(...)
#> 52. └─ggplot2 (local) f(l = layers[[i]], d = data[[i]])
#> 53. └─l$compute_aesthetics(d, plot)
#> 54. └─ggplot2 (local) compute_aesthetics(..., self = self)
#> 55. └─cli::cli_abort(...)
#> 56. └─rlang::abort(...)
So what is the new, officially recommanded approach here? There was a similar post a year ago but it received no answer.
no visible binding for global variable 'density'
Created on 2022-12-10 with reprex v2.0.2
CodePudding user response:
You can avoid the "no visible binding" CMD nag by defusing a string-as-symbol argument:
library(ggplot2)
ggplot(mpg, aes(displ))
geom_histogram(aes(y = after_stat(!!str2lang("density"))))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Created on 2022-12-11 with reprex v2.0.2