ggplot внутри renderPlot не может распознать ввод $ myvariable - PullRequest
1 голос
/ 06 января 2020

У меня есть ggplot внутри функции renderPlot. Этот кодовый блок работает, как и ожидалось:

output$revenue_channel <- renderPlot({
  ggplot(untrended_data(), aes(x = reorder(Channel, Revenue), y = Revenue), label = Revenue) +
    geom_bar(stat="identity", fill = "#008080", alpha = 0.6) +
    coord_flip() +
    geom_text(aes(label = scales::dollar(Revenue)), hjust= 1.2, color = "white") +
    scale_y_continuous(label = scales::label_dollar(scale = 0.001, suffix = "K")) +
    xlab("") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1))
}, height = 300)

Этот кодовый блок работает и выдает следующую диаграмму: enter image description here

Но по моему у меня фактически есть селектор пробоя, в котором пользователь мог ввести один из Channel, Device или UserType.

Итак, эта строка:

ggplot(untrended_data(), aes(x = reorder(Channel, Revenue), y = Revenue), label = Revenue)

станет либо такой:

ggplot(untrended_data(), aes(x = reorder(Device, Revenue), y = Revenue), label = Revenue)

Или это:

ggplot(untrended_data(), aes(x = reorder(UserType, Revenue), y = Revenue), label = Revenue)

Я пытался просто включить input$myinput, как это так

ggplot(untrended_data(), aes(x = reorder(input$breakdown, Revenue), y = Revenue), label = Revenue)

Но это выдает ошибку:

Ошибка: аргументы должны иметь той же длины

Затем я попытался aes_ для aes_string ():

ggplot(untrended_data(), aes_(x = reorder(input$breakdown, "Revenue"), y = "Revenue"), label = Revenue)

Дискретное значение передается в непрерывную шкалу

Затем я попытался не имеет смысла этой страницы квази-цитаты и попытался:

ggplot(untrended_data(), aes(x = reorder(!! input$breakdown, Revenue), y = Revenue), label = Revenue)

Что привело к:

Ошибка: аргументы должны иметь одинаковую длину

Как передать входную разбивку $ в ggplot в renderPlot({})?

1 Ответ

1 голос
/ 06 января 2020

input$breakdown сохраняет строку как значение, и если мы преобразуем ее в sym бол (используя rlang::sym) и затем оценим (!!), она будет работать, например,

library(ggplot2)
v1 <- "mpg";
ggplot(mtcars, aes(x = reorder(!! rlang::sym(v1), cyl), y = cyl, label = cyl))+
     geom_bar(stat="identity", fill = "#008080", alpha = 0.6) + 
    coord_flip()

В блоке кода ОП нам нужно использовать reorder(!! rlang::sym(input$breakdown), Revenue)

output$revenue_channel <- renderPlot({
  ggplot(untrended_data(), aes(x = reorder(!! rlang::sym(input$breakdown), Revenue),
          y = Revenue), label = Revenue) +
    geom_bar(stat="identity", fill = "#008080", alpha = 0.6) +
    coord_flip() +
    geom_text(aes(label = scales::dollar(Revenue)), hjust= 1.2, color = "white") +
    scale_y_continuous(label = scales::label_dollar(scale = 0.001, suffix = "K")) +
    xlab("") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1))
}, height = 300)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...