使用 NSE 在函数中订购条形图?

Ordering bar chart in function using NSE?

我目前正在尝试在 R 中订购条形图。该图是在函数中创建的,使用传递的变量来选择列。这是基本功能:

plotting <- function(column_to_use) {
  ggplot(iris, aes(x = Sepal.Length, ))+
    aes_string(y = column_to_use)+
    geom_col()
}

plotting("Species")

这产生了正确的情节,但我仍然必须订购它。我已经尝试了 base-R 重新排序和 forcats fct_reorder()。代码差异以粗体显示。


# reorder
plotting <- function(column_to_use) {
  ggplot(iris, aes(x = Sepal.Length, ))+
    aes_string(y = reorder(iris[column_to_use],Sepal.Width))+
    geom_col()
}

plotting("Species")

 > Error in tapply(X = X, INDEX = x, FUN = FUN, ...) : 
 object 'Sepal.Width' not found 

我正在使用 aes_string 使用非标准评估和数字转换变量列名称,这在重新排序中不起作用。遗憾的是,没有可用的 reorder_ 对应物。


# fct_reorder
plotting <- function(column_to_use) {
  iris %>%
    fct_reorder(iris[column_to_use],Sepal.Width) %>%
    ggplot( aes(x = Sepal.Length))+
    aes_string(y = column_to_use)+
    geom_col()
}

plotting("Species")
> Error: `f` must be a factor (or character vector).

获得 Sepal.Width 订购的金条有哪些更好的选择?

aes_string 已被软弃用。尝试使用 .data :

library(ggplot2)

plotting <- function(column_to_use) {
  ggplot(iris, aes(x = Sepal.Length, 
                   y = reorder(.data[[column_to_use]], Sepal.Width)))+
    geom_col()
}

plotting("Species")

我们可以转换为 symbol 并用 !! 求值。它可以接受带引号和不带引号的输入

library(ggplot2)
plotting <- function(column_to_use) {
  ggplot(iris, aes(x = Sepal.Length, 
               y = reorder(!! ensym(column_to_use), Sepal.Width)))+
   geom_col()
}

plotting("Species")
plotting(Species)