使事件响应式在Shiny模块中执行

时间:2019-03-12 14:31:17

标签: r shiny shiny-server shiny-reactivity shinyapps

我有一个selectInput UI对象,并且一旦用于从下拉选项中选择一个条目,我想读取RDS文件。 selectInput的选择是指向不同RDS文件的路径。 UI模块可以正常工作,而服务器模块则不能。我得到input$study,因此得到input$dataset1,然后一旦我从input $ 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 :(得分:0)

我将查看withProgressProgress的文档。 withProgress适用于在循环内运行的任务。 https://shiny.rstudio.com/reference/shiny/1.2.0/Progress.html

此外,请参见以下模块示例:https://shiny.rstudio.com/articles/modules.html。为了使数据框作为反应性值返回到模块外部,应将其创建为模块内部的反应性对象,然后按原样返回。另外,由于input$dataset1sce1所依赖的唯一无功值,因此可以使用reactive代替eventReactiveeventReactive更适合于反应式表达式中未实际使用的按钮之类的输入,而只是将服务器用作表达式执行的触发器。

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)


}

答案 1 :(得分:0)

已解决

我在模块功能中使用了以下内容:

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())。

谢谢