Чтение выбора списка ввода из внешнего источника в приложении Shiny (pickerInput) - PullRequest
1 голос
/ 28 февраля 2020

У меня есть простое приложение Shiny (см. Ниже).

Мне нужно прочитать возможный выбор для pickerInput виджета из внешнего файла (он часто обновляется).

Как я могу сделать это?

Пример ниже, очевидно, неверен, но у меня закончились все идеи.

Пример и то, что я попробовал

library("shiny")
library("shinyWidgets")

# Actual data: my_choices <- c("2018Q1","2018Q2","2018Q3", "2018Q4", "2019Q1", "2019Q2")

ui <- fluidPage(

  pickerInput(
    inputId = "id",
    label = "SELECT PERIOD:",
    choices = openxlsx::read.xlsx(xlsxFile = 
              "C:/Users/MyName/OneDrive/data.xlsx")$selection, # my_choices
    selected = NULL,
    multiple = TRUE, 
    options = list(
      `actions-box` = TRUE, size = 15, `selected-text-format` = "count > 3"
    ),
    choicesOpt = list(
      content = stringr::str_trunc(my_choices, width = 75)
    )
  ),
  verbatimTextOutput(outputId = "res")
)

server <- function(input, output, session) {
  output$res <- renderPrint(input$id)
}

shinyApp(ui = ui, server = server)


1 Ответ

2 голосов
/ 28 февраля 2020

Здесь может быть один подход. Вы можете использовать reactiveFileReader для периодической загрузки файла данных, который часто обновляется (вы можете указать частоту опроса). Затем используйте updatePickerInput для обновления ввода при изменении данных.

У меня не было доступа к my_choices, поэтому я прокомментировал это.

library("shiny")
library("shinyWidgets")
library("openxlsx")

# my_choices <- c("2018Q1","2018Q2","2018Q3", "2018Q4", "2019Q1", "2019Q2")

ui <- fluidPage(

  pickerInput(
    inputId = "id",
    label = "SELECT PERIOD:",
    choices = NULL,
    selected = NULL,
    multiple = TRUE, 
    options = list(
      `actions-box` = TRUE, size = 15, `selected-text-format` = "count > 3"
    )#,
    #choicesOpt = list(
    #  content = stringr::str_trunc(my_choices, width = 75)
    #)
  ),
  verbatimTextOutput(outputId = "res")
)

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

  fileData <- reactiveFileReader(1000,
                                 session,
                                 filePath = 'C:/Users/MyName/OneDrive/data.xlsx', 
                                 readFunc = read.xlsx)

  output$res <- renderPrint(input$id)

  observe({
    updatePickerInput(session, "id", choices = fileData()$selection)
  })
}

shinyApp(ui = ui, server = server)

Редактировать

Если вам нужно только загрузить файл при запуске приложения вам не понадобится reactiveFileReader:

observe({
  updatePickerInput(session, "id", choices = openxlsx::read.xlsx(xlsxFile = 
    "C:/Users/MyName/OneDrive/data.xlsx")$selection)
})

В качестве альтернативы, вы можете загрузить файл в кадр данных вне ui и ссылаться на столбец dataframe selection в вашем pickerInput.

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