Shiny模块内部的反应性不起作用

时间:2017-11-22 14:03:44

标签: r shiny

我正在努力应对闪亮模块中的反应。 我试图使用checkboxgroupInput和反应数据库取决于模块内的选择,但没有成功。 我的代码:

library(shiny)
library(data.table)

country <- c('Argentina', 'United States', 'Peru', 'India', 'United Kingdom', 'Colombia','Others',
   'Argentina', 'United States', 'Peru', 'India', 'United Kingdom', 'Colombia','Others')
value1 <- c(1,4,2,5,7,8,9,4,3,2,1,1,4,8)
value2 <- c(6,5,7,9,0,4,3,3,5,6,7,1,2,3)

data <- data.table(country,value1, value2)


# MODULE UI 
module_UI <- function(id) {
 ns <- NS(id)
  fluidRow(
        uiOutput(ns('choose_countries')),
        verbatimTextOutput(ns("countries")),
        verbatimTextOutput(ns("mean"))
     )

}

# MODULE Server
module_OUT <- function(input, output, session, df, metric) {

  # countries selector
  output$choose_countries <- renderUI({
checkboxGroupInput("choose_countries", label = "Choose countries:",
                   choices = list('Argentina', 'United States', 'Peru', 'India', 'United Kingdom', 'Colombia','Others'),
                   selected = c('Argentina', 'United States', 'Peru', 'India', 'United Kingdom', 'Colombia', 'Others'), inline = T)
  })

  output$countries <- renderPrint({ input$choose_countries })

  react_df <- reactive({
    react_df <- df[country %in% input$choose_countries,]

  })

  output$mean <- renderPrint({ mean(react_df()$metric)})
} 


# App ui
library(shinydashboard)
ui <- fluidPage(
  module_UI("test_1")
)

# App server
server <- function(input, output,session){
   callModule(module_OUT, "test_1", data, 'value1')

}

shinyApp(ui, server)

未显示所选国家/地区,也未显示所选指标的平均值。

我在没有使用模块的情况下测试了这个简单的代码并且工作正常。

有什么想法吗?提前致谢

1 个答案:

答案 0 :(得分:0)

在模块中使用动态UI时,请确保输入ID已正确命名空间。

module_OUT <- function(input, output, session, df, metric) {
  ns <- session$ns

  # countries selector
  output$choose_countries <- renderUI({
    checkboxGroupInput(ns("choose_countries"), label = "Choose countries:",
                       choices = list('Argentina', 'United States', 'Peru', 'India', 'United Kingdom', 'Colombia','Others'),
                       selected = c('Argentina', 'United States', 'Peru', 'India', 'United Kingdom', 'Colombia', 'Others'), inline = T)
  })
  

在模块中使用renderUI

     

在模块内部,您可能希望使用uiOutput / renderUI。如果您的renderUI块本身包含输入/输出,则需要使用ns()来包装您的ID参数,就像上面的示例一样。但是那些ns实例是使用NS(id)创建的,在这种情况下,没有使用id参数。怎么办?

     

会话参数可以为您提供ns;只需致电ns <- session$ns。这会将ID放在与会话相同的名称空间中。

https://shiny.rstudio.com/articles/modules.html