Использование линейной операции двух программно определенных переменных в качестве эстетики c в ggplot - PullRequest
1 голос
/ 09 января 2020

Я изо всех сил пытаюсь написать очень простую оболочку для создания графиков для различных переменных. Скажем, мои данные:

data <- tibble(year = seq(2001,2015),var1 = rnorm(15, mean=2), var1_sd = rnorm(15, mean=1, sd=0.8), var2 = rnorm(15, mean=7), var2_sd = rnorm(15, mean=1, sd=0.15))

и график, который я хочу сделать, составляет

ggplot(data,aes(x=year, y=var1)) + 
    geom_pointrange(aes(ymin=var1-var1_sd, ymax=var1+var1_sd))

Я хочу сделать точно такой же график для ряда переменных комбинации, поэтому я написал оболочку:

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

Когда я вызываю myplot(data, var1), я получаю ошибку "Ошибка в (~ var1) -" var1_sd ": non-Numberri c аргумент к бинарному оператору "

Я думаю, что проблема в линейной операции между не заключенными в кавычки переменными? Кто-нибудь знает как это обойти?

Спасибо !!!

Ответы [ 2 ]

2 голосов
/ 09 января 2020

На данный момент 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))
}
1 голос
/ 09 января 2020

После преобразования в символ в соответствии с предложением @Marius, вы также можете использовать оператор фигурной формы ({{}})

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)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...