0

我有一个 selectInput UI 对象,一旦它用于从下拉选项中选择一个条目,我想读取一个 RDS 文件。的selectInput选择是不同RDS文件的路径。UI 模块工作正常,但服务器模块却不行。我得到input$studyand 因此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 }) )


}
4

2 回答 2

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它作为函数参数传递给其他模块(使用sce1not sce1())或在主应用程序的其他代码段中使用它(但在这种情况下使用sce1())。

谢谢

于 2019-03-14T11:22:29.163 回答
0

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

此外,请参阅此模块示例:https ://shiny.rstudio.com/articles/modules.html 。为了使数据帧作为模块外部的反应值返回,它应该在模块内部创建为反应对象,然后按原样返回。此外,因为input$dataset1是唯一sce1依赖的反应值,reactive所以可以用来代替eventReactive. 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)


}
于 2019-03-12T18:41:41.353 回答