【问题标题】:Reactivity inside Shiny modules NOT working闪亮模块内的反应性不起作用
【发布时间】:2017-11-22 14:03:43
【问题描述】:

我正在努力应对闪亮模块中的反应性。 我正在尝试根据模块内的选择使用复选框组输入和反应式数据库,但没有成功。 我的代码:

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)

未显示所选国家或所选指标的平均值。

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

有什么想法吗?提前致谢

【问题讨论】:

  • 使用session$ns("choose_countries")作为渲染UI函数的inputId。
  • 使用@greg L 建议的ns &lt;- session$ns 或@Ryan Morton 建议的session$ns("choose_countries") 使output$countries 工作正常,但对output$mean 没有帮助...什么是我真正的问题(模块内的反应性)...

标签: r shiny


【解决方案1】:

当您在模块中使用动态 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 &lt;- session$ns。这会将 ID 放在与会话相同的命名空间中。

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

【讨论】:

  • 使用@greg L 建议的ns &lt;- session$ns 或@Ryan Morton 建议的session$ns("choose_countries") 使output$countries 工作正常,但对output$mean 没有帮助...什么是我真正的问题(模块内的反应性)...
  • 该问题与反应性无关。代码是错误的。尝试类似:mean(react_df()[[metric]])
猜你喜欢
  • 2018-07-13
  • 2021-12-06
  • 2019-09-01
  • 2020-03-12
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2019-02-09
  • 2021-07-17
相关资源
最近更新 更多