如何在反应值中存储Shiny模块的返回值?

时间:2018-02-20 09:59:01

标签: r shiny

下面的

版本1 是一个玩具模块,它要求用户输入txt,并将输入返回到主Shiny应用程序。然后,主Shiny应用程序渲染文本并将其输出到屏幕。

这里我将模块的返回值存储在一个名为mytxt的变量中,并通过renderText({ mytxt() })调用它。

但是,我真正想要做的是将返回的值存储在主Shiny应用程序中的 reactiveValues 中。 (如果我输出它是否无关紧要,因为我想对该值进行进一步的评估。)但遗憾的是我发现没有办法让它起作用。我在下面的版本2 中显示我的失败代码。

版本1 (正确)

app.R

library(shiny)
source("module_1.R")

ui <- fluidPage(

  returnUI("returntxt"),
  textOutput("mytxt")

)

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

  mytxt <- callModule(returnServer, "returntxt")

  output$mytxt <- renderText({ mytxt() })

}

shinyApp(ui, server)

module_1.R

returnUI = function(id) {
  ns <- NS(id)

  tagList(
    textInput(ns("txt"), "Write something")
  )
}


returnServer = function(input, output, session) {
  mytxt <- reactive({
    input$txt
  })

  return(mytxt)
}

第2版(需要帮助!)

app.R

library(shiny)
source("modules/module_1.R")

ui <- fluidPage(

  returnUI("returntxt"),
  textOutput("mytxt")

)

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

  myvals <- reactiveValues(
    txt = NULL
  )

  mytxt <- callModule(returnServer, "returntxt")

  myvals$txt <- isolate(mytxt())

  output$mytxt <- renderText({ myvals$txt })

}

shinyApp(ui, server)

module.R与版本1相同。

1 个答案:

答案 0 :(得分:7)

我刚刚从模块中返回reactiveValues并使用observe :)找到答案!喔!

app.R

library(shiny)
source("modules/module_1.R")

ui <- fluidPage(

  returnUI("returntxt"),
  textOutput("mytxt")

)

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

  myvals <- reactiveValues(
    txt = NULL
  )

  mytxt <- callModule(returnServer, "returntxt")

  observe({ 
    myvals$txt <- mytxt$txt 
    print(myvals$txt)
  })

  output$mytxt <- renderText({ myvals$txt })

}

shinyApp(ui, server)

module_1.R

returnUI = function(id) {
  ns <- NS(id)

  tagList(
    textInput(ns("txt"), "Write something")
  )
}

returnServer = function(input, output, session) {
  myreturn <- reactiveValues()

  observe({ myreturn$txt <- input$txt })

  return(myreturn)
}