10

我想将带引号的字符串传递给调用 ggplot2 的函数。

library(magrittr); library(ggplot2)
g1 <- function( variable ) {
  ggplot(mtcars, aes_string("wt", variable, size="carb")) +
    geom_point()
}
g1("mpg")

这很好用,但是v3.1.0 文档提倡 quasiquotation 和 NSE aes()

所有这些功能都被软弃用。请改用整洁的评估习语(请参阅 aes() 文档中的 quasiquotation 部分)。

但是这些aes()示例使用 NSE(g1(mpg)而不是g1("mpg"))。同样,这些 SO 解决方案使用 NSE 值或aes_()/ aes_string()

我希望该函数接受 SE/引用的字符串,以容纳字符向量,例如:

variables <- c("mpg", "cyl", "disp")
variables %>% 
  lapply(g1)
4

2 回答 2

11

您可以!!在调用 后对变量使用运算符来执行此操作symvariable这将在周围环境中取消引用和评估。

library(rlang)
g1 <- function( variable ) {
  ggplot(mtcars, aes(x = wt, y = !! sym(variable) , size = "carb")) +
    geom_point()
}
g1("mpg")

variables <- c("mpg", "cyl", "disp")
variables %>% 
  lapply(g1)
于 2019-03-13T03:28:35.160 回答
3

一种解决方法是用通用名称替换函数中感兴趣的变量名称:

g1 <- function( variable ) {
  colnames(mtcars) <- gsub(variable, "variable", colnames(mtcars))
  ggplot(mtcars, aes(x=wt, y=variable, size=carb)) +
    geom_point() + ylab(variable)
}

variables <- c("mpg", "cyl", "disp")
variables %>% 
  lapply(g1)
于 2019-03-13T02:48:01.200 回答