使用 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_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,y = reorder(!! ensym(column_to_use),Sepal.Width)))+
   geom_col()
}

plotting("Species")
plotting(Species)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...