30

我经常在工作中使用ggplot2并构建包装函数来加快我的工作流程。使用非标准评估 (NSE)aes迫使我使用实际的变量名而不是传递字符串。所以我复制并重命名数据框和变量名来安抚ggplot2。一定有更好的方法。如何让ggplot2通过函数包装器接受未知的数据框和列名,而不复制数据框并使用通用列名?

这有效:

ggplot(mtcars, aes(x=mpg, y=hp)) +
    geom_point()

这不会:

FUN <- function(dat, x, y) {
    ggplot(dat, aes(x = x, y = y)) +
        geom_point()
}

FUN(mtcars, "mpg", "hp")
4

2 回答 2

48

有一个aes_string功能,我并没有真正看到突出,它正是这样做的:

FUN <- function(dat, x, y) {
    ggplot(dat, aes_string(x = x, y = y)) +
        geom_point()
}

FUN(mtcars, "mpg", "hp")
于 2013-11-07T01:32:16.723 回答
9

现在建议使用.data代词

FUN <- function(dat, x, y) {
  ggplot(dat, aes(x = .data[[x]], y = .data[[y]])) +
    geom_point()
}

FUN(mtcars, "mpg", "hp")

在此处输入图像描述

其他几个选择 -

#Using get
FUN <- function(dat, x, y) {
  ggplot(dat, aes(x = get(x), y = get(y))) +
    geom_point()
}

#Using sym

FUN <- function(dat, x, y) {
  ggplot(dat, aes(x = !!sym(x), y = !!sym(y))) +
    geom_point()
}
于 2021-06-24T04:43:34.383 回答