在闪亮的应用程序中捕获点击的 Js 技术不捕获节点 ID

Js technicue to capture clicks in a shiny app does not capture node id

我有下面的 shiny 应用程序,我在其中使用 js 技术来捕获应用程序中的点击,而无需使用闪亮的输入元素。它运行良好但不适用于节点,因为我希望能够捕获节点并获取节点 ID。

逻辑如下:我单击 "Click me" 文本或节点,然后在 Rstudio 控制台中键入 input$js.node_clicked。结果应该是“one_1”,我可以接受,因为 "one" 对应于节点,点击序列上的“_1”。但是当我点击节点时,我只得到“_1”而不是节点 ID“one_1”。逻辑来自here.

library(shiny)
library(shinyWidgets)
library(DiagrammeR)
library(magrittr)

js <- '
$(document).on("click", ".node", function(e) {
if(typeof BUTTON_CLICK_COUNT == "undefined") {
BUTTON_CLICK_COUNT = 1;
} else {
BUTTON_CLICK_COUNT ++;
}
Shiny.onInputChange("js.node_clicked",
e.target.id + "_" + BUTTON_CLICK_COUNT);
});
'

ui <- fluidPage(
  tags$script(HTML(js))
  ,
  div(id="one","click me",class="node")
  ,
  uiOutput("main")
)

server <- function(input, output) {
  
  output$main <- renderUI({
    tagList(
      div(
        grVizOutput("grr", width = "100%", height = "90vh")
      ))
    
  })
  
  output$grr <- renderGrViz(grViz( "digraph test{
A[tooltip='A word'];
B[tooltip='Another word'];
A -> B;}" )
  )
  
  observeEvent(input$js.node_clicked , {
    browser()
  }) #
  
}

shinyApp(ui, server)

这是这样工作的。您必须使用 currentTarget 而不是 target。避免在Shiny.setInputValue(或Shiny.onInputChange,两者相同)的输入名称中包含点,因为点具有特殊含义。

library(shiny)
library(shinyWidgets)
library(DiagrammeR)
library(magrittr)

js <- '
$(document).on("click", ".node", function(e) {
  if(typeof BUTTON_CLICK_COUNT === "undefined") {
    BUTTON_CLICK_COUNT = 1;
  } else {
    BUTTON_CLICK_COUNT++;
  }
  Shiny.setInputValue("js_node_clicked",
    e.currentTarget.id + "_" + BUTTON_CLICK_COUNT);
});
'

ui <- fluidPage(
  tags$script(HTML(js)),
  
  div(id="one", "click me", class="node"),
  
  uiOutput("main")
)

server <- function(input, output) {
  
  output$main <- renderUI({
    tagList(
      div(
        grVizOutput("grr", width = "100%", height = "90vh")
      )
    )
  })
  
  output$grr <- renderGrViz(grViz( "digraph test{
A[tooltip='A word'];
B[tooltip='Another word'];
A -> B;}" )
  )
  
  observeEvent(input$js_node_clicked , {
    print(input$js_node_clicked)
  }) 
  
}

shinyApp(ui, server)