如何在按钮时钟上显示不同的信息框

时间:2019-06-13 09:33:06

标签: r shiny shinydashboard

我正在sinydashboard中的一个应用程序上工作,在该应用程序中,用户单击按钮即可生成一个随机数。随机数对应于数据框中的一行,我需要使用infoBox将其显示在仪表板上。每个infoBox都需要保留在屏幕上,直到用户关闭应用程序为止。

我尝试在server.R中的每次点击上生成一个新的输出变量,但是我找不到在ui.R中引用它的方法。下面的最小示例。我没有在每次按钮单击时为输出变量生成名称,因为这根本不起作用。

library(shiny)
library(shinydashboard)

ui <- dashboardPage(dashboardHeader(title = ""),

                    dashboardSidebar(),

                    dashboardBody(fluidRow(
                      box(
                        width = 3,
                        actionButton(inputId = "generateButton",
                                     label = "Generate")
                      ),

                      box(infoBoxOutput("rnum1"))
                    )))

server <- function(input, output) {
  randomData <- data.frame("RN" = runif(100, 1, 100))

  observeEvent(input$generateButton, {
    randomNumber <- floor(runif(1, 1, 100))
    dataRow <- randomData[randomNumber,]

    # Display dataRow in a persistent infoBox
    # in a way that 5 clicks will produce 5 boxes
    # Number of clicks is not known in advance
    output$rnum1 <- renderInfoBox({
      infoBox("Number", dataRow)
    })

  })
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

也许这就是您想要的,请草稿。您需要一个反应性变量来存储已经生成的数字,以便能够持久存储某些内容。

library(shiny)
library(shinydashboard)

ui <- dashboardPage(dashboardHeader(title = ""),

                    dashboardSidebar(),

                    dashboardBody(actionButton(inputId = "generateButton",
                                               label = "Generate")
                                  ,
                                  uiOutput('infoBoxes'))
)

server <- function(input, output) {
  randomData <- data.frame("RN" = runif(100, 1, 100))

  rv <- reactiveValues()


  observeEvent(input$generateButton, {
    randomNumber <- floor(runif(1, 1, 100))
    dataRow <- randomData[randomNumber,]
    print(dataRow)

    rv$persistent <- c(rv$persistent, dataRow)

    # Display dataRow in a persistent infoBox
  })

  output$infoBoxes = renderUI({
    if(length(rv$persistent) > 0 ) {
      fluidRow(
        Map(function(x) infoBox('title', rv$persistent[x]), 1:length(rv$persistent))
      ) 
    }
  })
}

shinyApp(ui = ui, server = server)