Как отображать разные инфобоксы на кнопочных часах - PullRequest
0 голосов
/ 13 июня 2019

Я работаю над приложением в 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 голосов
/ 13 июня 2019

Может быть, это то, что вы хотите, по крайней мере, это черновик.Вам понадобится реактивная переменная для хранения уже сгенерированных чисел, чтобы иметь возможность сохранять что-то постоянное.

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)
...