【问题标题】:Js technicue to capture clicks in a shiny app does not capture node id在闪亮的应用程序中捕获点击的 Js 技术不会捕获节点 ID
【发布时间】:2022-01-23 20:05:12
【问题描述】:

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

逻辑如下:单击"Click me" 文本或节点,然后在Rstudio 控制台中输入input$js.node_clicked。结果应该是“one_1”,我可以接受 ase "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)

【问题讨论】:

  • 什么叫“节点”?文档的孩子?
  • 啊我没看到,你定义了一个类node

标签: javascript r shiny nodes


【解决方案1】:

这样工作。您必须使用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)

【讨论】:

  • 当我点击 2 个节点之一时,我仍然只得到点击序列 _1 而不是 one_1 或 two_1
  • @firmo23 两个节点?第二个在哪里?我瞎了吗?我只看到一个带有 node 类的 div。
  • 我的意思是当你运行应用程序时有 2 个节点你看不到圆圈 A 和 B 吗?当我点击其中的 oen 时,我想获得 one_1、one_2、one_3 等或 two_1、two_2、two_3 等。现在,当我在节点(圆圈)内点击时,我会获得 _1、_2、_3 等
  • @firmo23 但是你的圈子没有node 类,也没有id!
  • @firmo23 我刚刚用检查工具检查过。确实,有一个 id 和类 node,但这是一些 SVG,所以这是特别的(我不掌握 svg)。
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
相关资源
最近更新 更多