R не рендерится на Shiny DashBoard после редактирования табитем - PullRequest
0 голосов
/ 04 апреля 2020
library(shiny)
library(tidyverse)
library(leaflet)
library(shinydashboard)
library(RColorBrewer)
library(viridis)
library(shinyWidgets)


ui <- dashboardPage(
    dashboardHeader(title = "Basic dashboard"),
    dashboardSidebar(
        sidebarMenu(
            menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")

                ),
            menuItem("Widgets", tabName = "widgets", icon = icon("th"))
        )
    ),
    dashboardBody(
        # Boxes need to be put in a row (or column)
        tabItems(
            # First tab content
            tabItem(tabName = "dashboard",
                    fluidRow(
                        box(plotOutput("plot1", height = 250)),
                        box(
                            title = "Controls",
                            sliderInput("slider", "Number of observations:", 1, 100, 50)
                        )
                    )
            ),
            # Second tab content
            tabItem(tabName = "widgets",
                    h2("Widgets tab content")
            )
        )
    )
)
server <- function(input, output) {
    set.seed(122)
    histdata <- rnorm(500)
    output$plot1 <- renderPlot({
        data <- histdata[seq_len(input$slider)]
        hist(data)
    })
}
shinyApp(ui, server)

В приведенном выше примере выходные данные отображаются при отдельном щелчке по панели инструментов и виджетам. На вкладке панели инструментов у меня есть ползунок ввода в теле. Теперь, когда я изменил свой ползунок, чтобы он был на боковой панели:

library(shiny)
library(tidyverse)
library(leaflet)
library(shinydashboard)
library(RColorBrewer)
library(viridis)
library(shinyWidgets)

ui = dashboardPage(
    dashboardHeader(title =  "Dashboard"),
    dashboardSidebar(
        sidebarMenu(
            id = "sidebarmenu",
            menuItem("menuItem1", 
                     tabName = "tab1",
                     sliderInput("slider", "Number of observations:", 1, 100, 50)
            )
            ,
            menuItem("menuItem2", tabName = "tab2")
        )
    ),
    dashboardBody(
        tabItems(
            tabItem(tabName = "tab1",
                    tableOutput("myTable"),
            ),
            tabItem(tabName = "tab2",
                    h2("Placeholder Cloud"),
                    plotOutput("myPlot"))
        )
    )
)

server <- function(input, output, session) {

    tableData = reactiveVal(data.frame(x = 1:10, y = LETTERS[1:10]))
    plotData = reactiveVal()

    observeEvent(input$sidebarmenu, {

        if(input$sidebarmenu == "tab2"){
            #Code for tab 2
            req(is.null(plotData()))
            print("Tab 2 code is run")
            plotData(runif(100))

        }

    })

    output$myTable = renderTable({
        tableData()
    })

    set.seed(122)
    histdata <- rnorm(500)
    output$myPlot = renderPlot({
        data <- histdata[seq_len(input$slider)]
        hist(data)
    })
}

shinyApp(ui, server)

Проблема здесь: 1) Облако текстового заполнителя, первоначально отображаемое только при нажатии на вкладку menuItem2, теперь отображается вместе с гистограммой, которая должен был отображаться только когда я нажал menuItem1

2) нажатие на menuItem2 ничего не делает. Я хотел бы, чтобы при нажатии кнопки tab2 отображалась диаграмма рассеяния, как показано в этом блоке кода ниже.

то есть, я хотел бы "интегрировать нижний 3-й блок кода" во 2-й, описанный выше, поэтому, когда я запускаю второй блок кода, когда я нажимаю tab1, появляется вход для ползунка и отображается гистограмма. когда я нажимаю tab2, диаграмма рассеяния будет оказана

library(shiny)
library(tidyverse)
library(leaflet)
library(shinydashboard)
library(RColorBrewer)
library(viridis)
library(shinyWidgets)

ui = dashboardPage(
    dashboardHeader(title =  "Dashboard"),
    dashboardSidebar(
        sidebarMenu(
            id = "sidebarmenu",
            menuItem("menuItem1", 
                     tabName = "tab1")
                ,
            menuItem("menuItem2", tabName = "tab2")
        )
    ),
    dashboardBody(
        tabItems(
            tabItem(tabName = "tab1",
                    tableOutput("myTable")),
            tabItem(tabName = "tab2",
                    h2("Placeholder Cloud"),
                    plotOutput("myPlot"))
        )
    )
)

server <- function(input, output, session) {

    tableData = reactiveVal(data.frame(x = 1:10, y = LETTERS[1:10]))
    plotData = reactiveVal()

    observeEvent(input$sidebarmenu, {

        if(input$sidebarmenu == "tab2"){
            #Code for tab 2
            req(is.null(plotData()))
            print("Tab 2 code is run")
            plotData(runif(100))

        }

    })

    output$myTable = renderTable({
        tableData()
    })

    output$myPlot = renderPlot({
        plot(plotData())
    })
}

shinyApp(ui, server)

Любая помощь приветствуется. Я новичок в Shiny.

1 Ответ

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

для вашей второй части вы сказали: «нажатие на menuItem2 ничего не делает» ... но у вас нет никаких действий для menuItem2, см.

menuItem("menuItem2", tabName = "tab2")

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