Как создать новый объект в функции R, который я могу использовать внутри функции - PullRequest
2 голосов
/ 22 апреля 2020

Я пытаюсь написать функцию, которая создаст ggplot, в котором все компоненты основаны на одном входе. У меня есть фрейм данных с расой, результаты по трем оценкам (чтение, письмо, математика) плюс доверительный интервал для каждого результата. Я хочу создать функцию, которая будет создавать тот же график на основе Read, Write или Math.

Например, это работает, если я использую var Read_per c

library(tidyverse)
dat <- data.frame (Race = c("White", "Black", "Inidigenous"),
                  Read_perc = c (0.756, 0.592, 0.548),
                  Read_low_ci = c (0.742, 0.498, 0.467),
                  Read_high_ci = c(0.769, 0.679, 0.628),
                  Write_perc = c (0.717, 0.625, 0.497),
                  Write_low_ci = c (0.703, 0.532, 0.416),
                  Write_high_ci = c (0.731, 0.710, 0.578))

my_plot_function <- function (df, var){
  var <- enquo(var)
  df %>% 
    ggplot (aes (x = reorder (Race, !! var), y = !! var)) +
    geom_col () +
    coord_flip () +
    geom_text (aes (label = scales::percent(!! var, accuracy = 1)),
               y = 0.05,
               colour = "white")

}

my_plot_function(dat, Read_perc)

Однако Я хочу использовать только чтение или запись, а затем использовать его для вызова различных столбцов, таких как Read_per c, Read_low_ci, et c.

Например, это не работает:

my_plot_function <- function (df, var){

var <- enquo (var)
var_low_ci <- paste0 (var, "_low_ci")
var_high_ci <- paste0 (var, "_high_ci")

df %>% 
    ggplot (aes (x = reorder (Race, !! var), y = !! var)) +
    geom_col () +
    coord_flip () +
    geom_text (aes (label = scales::percent(!! var, accuracy = 1)),
               y = 0.05,
               colour = "white") +
       geom_errorbar(aes(ymin = var_low_ci,
                         ymax = var_high_ci),
                         colour = "black")

Окончательный график должен выглядеть примерно так:

enter image description here

1 Ответ

3 голосов
/ 22 апреля 2020

Мы можем преобразовать в sym больший

my_plot_function <- function (df, var){

   var <- rlang::as_string(rlang::ensym(var))
   var_low_ci <- rlang::sym(str_c(str_remove(var, "_perc"), "_low_ci"))
   var_high_ci <- rlang::sym(str_c(str_remove(var, "_perc"), "_high_ci"))
    var1 <- rlang::sym(var)

  df %>% 
    ggplot(aes(x = reorder(Race, !! var1), y = !! var1)) +
    geom_col () + 
    coord_flip () +
           geom_text(aes(label = scales::percent(!! var1, accuracy = 1)),
                      y = 0.05,
                      colour = "white") +
              geom_errorbar(aes(ymin = !!var_low_ci,
                                ymax = !!var_high_ci),
                                colour = "black")
}

тест

my_plot_function(dat, Read_perc)

enter image description here

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