R 使用两个编程定义变量的线性运算作为ggplot中的美学

R 使用两个编程定义变量的线性运算作为ggplot中的美学,r,ggplot2,dplyr,rlang,tidyeval,R,Ggplot2,Dplyr,Rlang,Tidyeval,我正在努力编写一个非常简单的包装器,为不同的变量生成绘图。假设我的数据是: 数据目前,sdvar只是一个字符串。您可以使用sym将其转换为符号,然后取消引用即可: myplot <- function(data, var) { var <- enquo(var) sdvar <- sym(paste0(quo_name(var), "_sd")) ggplot(data,aes(x=year, y=!!var)) + geom_point

我正在努力编写一个非常简单的包装器,为不同的变量生成绘图。假设我的数据是:

数据目前,sdvar只是一个字符串。您可以使用sym将其转换为符号,然后取消引用即可:

myplot <- function(data, var) {
    var <- enquo(var)
    sdvar <- sym(paste0(quo_name(var), "_sd"))
    ggplot(data,aes(x=year, y=!!var)) +
        geom_pointrange(aes(ymin=!!var-!!sdvar, ymax=!!var+!!sdvar))
}
目前,sdvar只是一个字符串。您可以使用sym将其转换为符号,然后取消引用即可:

myplot <- function(data, var) {
    var <- enquo(var)
    sdvar <- sym(paste0(quo_name(var), "_sd"))
    ggplot(data,aes(x=year, y=!!var)) +
        geom_pointrange(aes(ymin=!!var-!!sdvar, ymax=!!var+!!sdvar))
}

按照@Marius的建议转换为符号后,还可以使用curly-curly操作符{{}


按照@Marius的建议转换为符号后,还可以使用curly-curly操作符{{}


啊,我离得太近了!谢谢你,我真的很难接受非标准的评估…你知道有什么好的资源可以更好地理解字符串、符号、QUOSURE和变量名之间的区别吗?我仍然觉得这让我自己很困惑。我正在寻找一个很好的资源来总结所有这些东西-我刚刚搜索并找到了看起来很有希望的。啊,我太接近了!谢谢你,我真的很难接受非标准的评估…你知道有什么好的资源可以更好地理解字符串、符号、QUOSURE和变量名之间的区别吗?我仍然觉得这让我自己很困惑。我正在寻找一个很好的资源来总结所有这些东西-我刚刚搜索并找到了看起来很有希望的。谢谢@ronak,bang-bang和curly-curly有什么区别?有哪一个比另一个更有效率吗?@Mar我不确定效率如何,但curly-curly是几个月前推出的,是bang-bang的继任者。你可以在这里读到:如果我使用curly-curly,那么我就不需要行变量。如果你只处理var,那么你就不需要行变量。但是在这里,因为你还需要生成sdvar,我们需要先将var转换为字符串。谢谢@ronak,bang-bang和curly-curly有什么区别?有哪一个比另一个更有效率吗?@Mar我不确定效率如何,但curly-curly是几个月前推出的,是bang-bang的继任者。你可以在这里读到:我是否正确地解释了,如果我使用curly-curly,那么我不需要行var如果你只处理var,那么你不需要它,但是在这里,因为你还需要生成sdvar,我们需要先将var转换成string。
myplot <- function(data, var) {
    var <- enquo(var)
    sdvar <- sym(paste0(quo_name(var), "_sd"))
    ggplot(data,aes(x=year, y=!!var)) +
        geom_pointrange(aes(ymin=!!var-!!sdvar, ymax=!!var+!!sdvar))
}
library(ggplot2)
library(rlang)


myplot <- function(data, var) {
  var <- enquo(var)
  sdvar <- sym(paste0(quo_name(var), "_sd"))
  ggplot(data,aes(x=year, y={{var}})) +
      geom_pointrange(aes(ymin={{var}}-{{sdvar}}, ymax={{var}}+ {{sdvar}}))
}

myplot(data, var1)