Почему заполнение не работает в моем ggplot в моем блестящем приложении? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь скопировать следующий код в мое блестящее приложение:

df1 <- df %>% 
  group_by(xyz, inception_month) %>% 
  summarise(policies = sum(policies))

a <- ggplot(df1, aes(x=as.factor(inception_month), y = policies,  fill = xyz)) +
  geom_bar(position = "fill", stat = "identity") + 
  theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
  xlab("Inception Month") +
  ylab("Policy Count")
print(a)

, что дает мне следующий желаемый результат: введите описание изображения здесь

Однако я не могу отобразить заливку со следующим динамическим c кодом:

server <- function(input, output) {

df1 <- reactive({df %>% group_by(input$rating_factor, inception_month) %>% summarise(policies = sum(policies))})

  output$plot <- renderPlot({
    p <- ggplot(data = df1(), aes(x=as.factor(inception_month), y = policies, fill = input$rating_factor)) +
      geom_bar(position = "fill", stat = "identity") +
    theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
      xlab("Inception Month") +
      ylab("Policy Count")

    print(p)
  })
}
shinyApp(ui, server)

df выглядит так:

df <- data.frame(
  xyz = c("A","A","B","B","B"),
  abc = c("X","X","Y","Y","Y"),
  inception_month = c("Feb 2020", "Nov 2019", "Feb 2020", "Dec 2019", "Feb 2020"),
  policies = c(1, 0, 1, 1, 1))

и пользовательский интерфейс:

library(shiny)
library(shinydashboard)
library(dplyr)
library(ggplot2)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(
    box(plotOutput("plot", height = 250)),

    box(
      title = "Select Rating Factor",
      selectInput("rating_factor", "Rating Factor", c("xyz", "abc"))
  )
  )
))

1 Ответ

0 голосов
/ 23 апреля 2020

input$rating_factor создает символьное значение, а не то, что ggplot ожидает. Вам нужно использовать !!sym(input$rating_factor).

Я согласен с комментарием Мейсона Бо. В следующий раз вы должны привести воспроизводимый пример. См. здесь или здесь , чтобы узнать, как его создать.

Редактировать: Подробно здесь , вам необходимо используйте !!sym() также во всех dplyr функциях. Вот ваш исправленный пример:

library(shiny)
library(shinydashboard)
library(dplyr)
library(ggplot2)

df <- data.frame(
  xyz = c("A","A","B","B","B"),
  abc = c("X","X","Y","Y","Y"),
  inception_month = c("Feb 2020", "Nov 2019", "Feb 2020", "Dec 2019", "Feb 2020"),
  policies = c(1, 0, 1, 1, 1))

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(
      box(plotOutput("plot", height = 250)),

      box(
        title = "Select Rating Factor",
        selectInput("rating_factor", "Rating Factor", c("xyz", "abc"))
      )
    )
  ))

server <- function(input, output) {

  df1 <- reactive({
    df %>% 
      group_by(!!sym(input$rating_factor), inception_month) %>% 
      summarise(policies = sum(policies))
  })

  output$plot <- renderPlot({
    p <- ggplot(data = df1(), aes(x=as.factor(inception_month), y = policies, fill = !!sym(input$rating_factor))) +
      geom_bar(position = "fill", stat = "identity") +
      theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
      xlab("Inception Month") +
      ylab("Policy Count")

    print(p)
  })

}

shinyApp(ui, server)
...