无法在 Shiny R dashboardBody 上单独显示我的简单条形图

Couldn't show my simple bar charts separately on Shiny R dashboardBody

所以我正在尝试制作一个非常简单的 Shiny R 仪表板,它显示将链接到可编辑 excel 文件的进度百分比。这是一个示例数据:

| Month    | PERCENTAGE     |
|:---------|:---------------|
| JAN      | 90             |
| FEB      | 78             |
| MAR      | 100            |
| APR      | 99             |
| MAY      | 90             |
| JUN      | 78             |
| JUL      | 100            |
| AUG      | 87             |
| SEP      | 90             |
| OCT      | 78             |
| NOV      | 99             |
| DES      | 100            |

这是我的 ui.R 代码:

library(ggplot2)
library(shiny)
library(tidyverse)
library(shinydashboard)
library(readxl)
library(shinyalert)

# data1 <- read_excel ("Data1.xlsx")

shinydashboard::dashboardPage(skin = "blue",
              dashboardHeader(title = "UPDL PANDAAN"),
              
              #sidebar
              dashboardSidebar(
                sidebarMenu(
                  menuItem("WIG PMK 2020", tabName = "WIGPMK", icon = icon("tachometer-alt")),
                  fluidPage(
                    actionButton("myButton", "About Us")
                  )
                )),
              dashboardBody(
                h1("PROSENTASE MATERI TAHUN 2022"),
                
                actionButton(
                  inputId = "input1",
                  label = 'JAN'),                           
                actionButton(
                  inputId = 'input2',
                  label = 'FEB'),
                actionButton(
                  inputId = 'input3',
                  label = 'MAR'),
                actionButton(
                  inputId = 'input4',
                  label = 'APR'),
                actionButton(
                  inputId = 'input5',
                  label = 'MAY'),
                actionButton(
                  inputId = 'input6',
                  label = 'JUN'),
                actionButton(
                  inputId = 'input7',
                  label = 'JUL'),
                actionButton(
                  inputId = 'input8',
                  label = 'AUG'),
                actionButton(
                  inputId = 'input9',
                  label = 'SEP'),
                actionButton(
                  inputId = 'input10',
                  label = 'OCT'),
                actionButton(
                  inputId = 'input11',
                  label = 'NOV'),
                actionButton(
                  inputId = 'input12',
                  label = 'DES'),
              
                fluidPage(
                  plotOutput('inpoet')
                )
              )
)

这是我的 server.R 代码:

library(ggplot2)
library(shiny)
library(tidyverse)
library(shinydashboard)
library(DT)
library(readxl)
library(shinyalert)

# Data1 <- read_excel("Data1.xlsx")

shinyServer(function(input, output, session) {
  function(input, output, session) {
    observeEvent(input$input1, {
      output$inpoet1 <- renderPlot({
        plotOutput('plot1')
      })
    })
    
    observeEvent(input$input2, {
      output$inpoet <- renderPlot({
        plotOutput('plot2')
      })
    })
    observeEvent(input$input3, {
      output$inpoet <- renderPlot({
        plotOutput('plot3')
      })
    })
    observeEvent(input$input4, {
      output$inpoet <- renderPlot({
        plotOutput('plot4')
      })
    })
    observeEvent(input$input5, {
      output$inpoet <- renderPlot({
        plotOutput('plot5')
      })
    })
    
    observeEvent(input$input6, {
      output$inpoet <- renderPlot({
        plotOutput('plot6')
      })
    })
    observeEvent(input$input7, {
      output$inpoet <- renderPlot({
        plotOutput('plot7')
      })
    })
    observeEvent(input$input8, {
      output$inpoet <- renderPlot({
        plotOutput('plot8')
      })
    })
    
    observeEvent(input$input9, {
      output$inpoet <- renderPlot({
        plotOutput('plot9')
      })
    })
    
    observeEvent(input$input10, {
      output$inpoet <- renderPlot({
        plotOutput('plot10')
      })
    })
    observeEvent(input$input11, {
      output$inpoet <- renderPlot({
        plotOutput('plot11')
      })
    })
    observeEvent(input$input12, {
      output$inpoet <- renderPlot({
        plotOutput('plot12')
      })
    })
    
    output$plot1 <- renderPlot({
      df <- data.frame(Month=c("JAN"),
                       Percentage=c(90))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot2 <- renderPlot({
      df <- data.frame(Month=c("FEB"),
                       Percentage=c(78))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot3 <- renderPlot({
      df <- data.frame(Month=c("MAR"),
                       Percentage=c(100))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot4 <- renderPlot({
      df <- data.frame(Month=c("APR"),
                       Percentage=c(99))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot5 <- renderPlot({
      df <- data.frame(Month=c("MAY"),
                       Percentage=c(90))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot6 <- renderPlot({
      df <- data.frame(Month=c("JUN"),
                       Percentage=c(78))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot7 <- renderPlot({
      df <- data.frame(Month=c("JUL"),
                       Percentage=c(100))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot8 <- renderPlot({
      df <- data.frame(Month=c("AUG"),
                       Percentage=c(87))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot9 <- renderPlot({
      df <- data.frame(Month=c("SEP"),
                       Percentage=c(90))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot10 <- renderPlot({
      df <- data.frame(Month=c("OCT"),
                       Percentage=c(78))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot11 <- renderPlot({
      df <- data.frame(Month=c("NOV"),
                       Percentage=c(100))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
    
    output$plot12 <- renderPlot({
      df <- data.frame(Month=c("DES"),
                       Percentage=c(100))
      head(df)
      p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
        geom_bar(stat="identity")+
        theme_minimal()
      p<-p + theme(legend.position="none")
      p
      p + coord_flip()
    })
  }
  

  observeEvent(input$myButton, {
    shinyalert(title = "UPDL PANDAAN", imageUrl ="https://lms.pln-pusdiklat.co.id/assets/themes/rti/frontend/img/logo-pln.png", imageWidth = "50%", imageHeight = "50%") }
  )

我是初学者。

的确,看起来你正在尝试做相对简单的应用程序(但是我认为根据开发人员的经验来定义复杂性是可以的)。

我将向您展示如何使其更简单以及如何使其发挥作用:

library(ggplot2)
library(shiny)
library(tidyverse)
library(shinydashboard)
library(readxl)
library(shinyalert)

data1 <- data.frame(
  stringsAsFactors = FALSE,
                     Month = c("JAN","FEB",
                               "MAR","APR","MAY","JUN","JUL","AUG","SEP",
                               "OCT","NOV","DES"),
                     Percentage = c(90L,78L,100L,
                               99L,90L,78L,100L,87L,90L,78L,99L,100L)
        )

ui <- shinydashboard::dashboardPage(skin = "blue",
                                    dashboardHeader(title = "UPDL PANDAAN"),
                                    
                                    #sidebar
                                    dashboardSidebar(
                                      sidebarMenu(
                                        menuItem("WIG PMK 2020", tabName = "WIGPMK", icon = icon("tachometer-alt")),
                                        fluidPage(
                                          actionButton("myButton", "About Us")
                                        )
                                      )),
                                    dashboardBody(
                                      h1("PROSENTASE MATERI TAHUN 2022"),
                                      
                                      selectInput("month", "Choose month", choices = data1$Month),
                                        plotOutput('inpoet')
                                    )
)

server <- function(input, output, session) {
  output$inpoet <- renderPlot({
    df <- data1 %>% 
      filter(Month == input$month)
    p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
      geom_bar(stat="identity")+
      theme_minimal()
    p<-p + theme(legend.position="none")
    p
    p + coord_flip()
  })
  
  observeEvent(input$myButton, {
    shinyalert(title = "UPDL PANDAAN", imageUrl ="https://lms.pln-pusdiklat.co.id/assets/themes/rti/frontend/img/logo-pln.png", imageWidth = "50%", imageHeight = "50%")
    })
}

shinyApp(ui, server)

在上面的应用程序中,我删除了 actionButton 并使用了 selectInput,因此我们将使用列表代替按钮。而在 server 部分我只留下了一个 renderPlot。我使用了一个文件(app.R,所以在底部是 shinyApp(ui, server) - 如果我们在一个文件中有应用程序,则需要这个)。

让我们仔细看看这一切:

  1. 你需要记住 ui 部分中的一个 plotOutput 需要通过公共 inputIdserver 部分中的一个 renderPlot 连接。所以,因为我们有 plotOutput('inpoet'),所以我们需要有 output$inpoet。没有它,您将看不到屏幕上呈现的任何内容。
  2. Shiny 如何知道 - 如果选择了新的月份 - 它应该显示不同的情节?这是因为 renderPlot 中的这段代码:filter(Month == input$month)。这里最重要的是 input$month - 当你在服务器部分使用 input$ 时(以及在反应上下文中,所以在 reactiveeventReactiveobserveobserveEvent 和任何 render* 函数),每当这个 input$ 改变时,Shiny 就会根据这个新的、改变的值重新计算新对象(绘图、data.frame 或其他)。

让我们仔细看看您的代码:

  1. 这个带有 actionButtons 的解决方案很糟糕,但我不确定如何解释它。也许看看我的提议 - 它比你的要简单得多。如果您更喜欢使用与您的应用更相似的东西 - 请查看 shiny 中的 radioButtons
  2. 你不应该嵌套反应式 - 这是一个不嵌套它们的好习惯,只是没有必要,可能在任何情况下都没有必要。