Выполнить событие EventReactive внутри модуля Shiny - PullRequest
0 голосов
/ 12 марта 2019

У меня есть объект пользовательского интерфейса selectInput, и я хотел бы, чтобы, как только он использовался для выбора записи из выпадающего списка, прочитал файл RDS.selectInput - это пути к разным RDS файлам.Модуль пользовательского интерфейса работает нормально, а сервер - нет.Я получаю input$study и, следовательно, input$dataset1, а затем, как только я выбираю запись из входных $ datasets1, приложение должно начать чтение файла RDS, но это не так.

Как вызвать выражение eventReactive внутримодуль для запуска и затем сделать этот файл RDS доступным для всего приложения для использования другими модулями?

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


  output$sce_objects <- renderUI({

    validate(need(input$study, message = FALSE))

    withProgress(message = "Getting SCE objects...", {

      objects <- FIND SOME FILES

      ns <- session$ns

      selectInput(inputId = ns("dataset1"),
                  label = "Select a specifc analysis",
                  width = "100%",
                  choices = c("", objects),
                  selected = "")

    }) 
  })


  sce1 <- eventReactive(input$dataset1, {

    validate(need(input$dataset1, message = FALSE))

    withProgress(message = "Reading data...", { readRDS(input$dataset1) })

  }) 



  return( reactive({ sce1 }) )


}

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

решено

Я использовал следующее в функции модуля:

sce1 <- reactive({

  validate(need(input$dataset1, message = FALSE))

  withProgress(message = "Reading data...", {

    dataset1 <- readRDS(input$dataset1)

  }) # withProgress

  return(dataset1)

}) # reactive


return(sce1)

и вызвал модуль в основном приложении, используя:

sce1 <- callModule(load_sce, "load_sce_explore")

Теперь я могупередать sce1 другим модулям в качестве аргумента функции (используйте sce1, а не sce1()) или используйте его в других фрагментах кода в основном приложении (но в этом случае используйте sce1()).

Спасибо

0 голосов
/ 12 марта 2019

Я бы просмотрел документацию для withProgress и Progress.withProgress для задач, работающих внутри цикла.https://shiny.rstudio.com/reference/shiny/1.2.0/Progress.html

Также см. Этот пример модуля: https://shiny.rstudio.com/articles/modules.html. Для того, чтобы кадр данных был возвращен как реактивное значение вне модуля, он должен быть создан как реактивный объект внутримодуль, а затем вернулся как таковой.Кроме того, поскольку input$dataset1 является единственным реактивным значением, от которого зависит sce1, вместо eventReactive можно использовать reactive.eventReactive лучше подходит для таких вводов, как кнопки, которые фактически не используются в реактивном выражении, а просто в качестве сервера для запуска выражения.

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


  output$sce_objects <- renderUI({

    validate(need(input$study, message = FALSE))

      objects <- FIND SOME FILES

      ns <- session$ns

      selectInput(inputId = ns("dataset1"),
                  label = "Select a specifc analysis",
                  width = "100%",
                  choices = c("", objects),
                  selected = "")

    }) 


  sce1 <- reactive({

    validate(need(input$dataset1, message = FALSE))

    progress <- Progress$new(session, min=0, max=1)
    on.exit(progress$close())

    progress$set(message = 'Reading data...')

    dataset1 <- readRDS(input$dataset1)

    progress$set(value = 1)

    return(df)
  }) 

  return(sce1)


}
...