R Shiny:如何保存模块的返回值?

时间:2019-04-27 07:43:08

标签: r shiny shiny-reactivity

我有一个简单的闪亮模块,我想从两个滑块输入中求和:

模块代码为:

模块

custSliderGroupInput <- function(id,slider1Name,slider2Name){
    ns <- NS(id)
    tagList(sliderInput(ns("slider1"),slider1Name,1,100,50),
            sliderInput(ns("slider2"),slider2Name,1,20,10))
}

custSliderGroup <- function(input,output,session){
    rv <- reactiveVal()
    observeEvent(c(input$slider1,input$slider2),{
        rv <- reactive({input$slider1 + input$slider2})
        print(rv())
        return(list(result = rv()))
    })
}

在我的app.R中,我想显示使用textOutput时的结果,但是它不起作用并且没有错误显示。 (该值确实会在控制台中打印出来。)

应用

library(shiny)
ui <- fluidPage(
        custSliderGroupInput("myslider","A","B"),
        textOutput("text")
    )


server <- function(input, output,session){
    output$text <- renderText({
        callModule(custSliderGroup,"myslider")$result
    })
}

shinyApp(ui = ui, server = server)

我在Google和StackOverflow上进行了搜索,但是所有解决方案都无法正常工作。

该消息确实在控制台中打印:
The message does get printed in the console

但UI上没有任何显示:
enter image description here

1 个答案:

答案 0 :(得分:0)

我通过某种方式解决了这个问题:

模块

custSliderGroupInput <- function(id,slider1Name,slider2Name){
    ns <- NS(id)
    tagList(sliderInput(ns("slider1"),slider1Name,1,100,50),
            sliderInput(ns("slider2"),slider2Name,1,20,10))
}

custSliderGroup <- function(input,output,session){
    rv <- input$slider1 + input$slider2
    return(rv)
}

应用

ui <- fluidPage(
        custSliderGroupInput("myslider","A","B"),
        textOutput("text")
    )


server <- function(input, output,session){
    output$text <- renderText({
        callModule(custSliderGroup,"myslider")
    })
}

shinyApp(ui = ui, server = server)

我不知道为什么,但是似乎使用reactive()observeEvent()之类的功能会使模块环境过于复杂,弊大于利。它只是通过简化代码而起作用。如果有人知道这在理论上是有效的还是无效的,请发表您的答案!

非常感谢!