In Shiny 使用模块时单击事件不起作用

In Shiny click event is not working when using modules

提问人:JohnBones JohnBones 提问时间:12/27/2022 更新时间:1/2/2023 访问量:360

问:

为什么当我使用模块时,我的 highchart 树状图中的可点击功能不起作用。

我在没有模块的情况下尝试过并且运行良好。

可能是与命名空间有关的东西,对吧,但我找不到它是什么。

有什么帮助吗?

这是我的代码:

library(shiny)
library(highcharter)
library(gapminder)
library(shinyjs)

source(file = 'module_ex_2.R')


ui <- fluidPage(

  mod_ex2_UI('ex1')

)

server <- function(input, output){
  mod_ex2_Server('ex1')

}

shinyApp(ui, server)

我的模块文件:

mod_ex2_UI <- function(id) {
  ns <- NS(id)
  tagList(

    highchartOutput(ns("hcontainer")),
    htmlOutput(ns("clicked"))

  )
}

mod_ex2_Server <- function(id) {
  moduleServer(
    id,
    function(input, output, session) {

      click_js <- JS("function(event) {Shiny.onInputChange('treemapclick', event.point.name);}")

      output$hcontainer <- renderHighchart({

        gapminder::gapminder %>%
          dplyr::filter(year  == 2007) %>%
          highcharter::data_to_hierarchical(group_vars = c(continent, country), size_var = pop) %>%
          hchart(type = "treemap") %>%
          hc_plotOptions(treemap = list(events = list(click = click_js)))

      })


      output$clicked <- renderUI({
        if(is.null(input$treemapclick)){
          reactable::reactable(data =gapminder::gapminder %>%
                                 dplyr::filter(year  == 2007) %>%
                                 dplyr::filter(country == 'China'))
        }else{


          reactable::reactable(data =gapminder::gapminder %>%
                                 dplyr::filter(year  == 2007) %>%
                                 dplyr::filter(country == input$treemapclick))
        }
      })

    }
  )
}

谢谢,任何帮助都会很棒。

JavaScript R 闪亮的 shinyjs

评论


答:

2赞 thothal 1/2/2023 #1

您需要将命名空间附加到自定义事件中,如下所示:

click_js <- JS(
   glue::glue("function(event) {{
                  Shiny.setInputValue('{NS(id)('treemapclick')}',
                                      event.point.name);
               }}"
   )
)

N.B. 是较旧的名称,后者更冗长(参见这篇 Shiny 文章onInputChangesetInputValue)