Shiny 未检测到shiny:inputchanged 事件

问题描述 投票:0回答:2

如果应用程序能够检测到最后单击或更新的小部件的 ID,那么我为闪亮的应用程序设计所采用的方法将是最简单的。

这个问题似乎可以解决问题。然而,当我使用接受的答案运行 MCVE 时,我根本没有任何反应。

当前代码如下。这本质上是一个链接的问题,明显替换了已接受的答案。

library(shiny)

ui <- fluidPage(
  tags$head(
    # taken from accepted answer
    tags$script(
      HTML("$(document).on('shiny:inputchanged', function(event) {
          Shiny.setInputValue('last_input', event.name);
        });")
    )
    # through to here
  ),
  
  numericInput("num1", "Numeric", 0),
  textInput("text1", "Text"),
  selectInput("select1", "Select", choices = LETTERS[1:4]),
  selectInput("selectize1", "Selectize", choices = letters[1:4]),
  
  textOutput("textout")
)

server <- function(input, output, session) {
  output$textout <- renderText({
    input$last_input
  })
}

shinyApp(ui, server)

预期行为:

  • 当与 widget 交互时,会显示最后一个交互的 widget 的 id。

观察到的行为:

  • 无论我与哪个小部件交互,都不会显示小部件 ID。

检查尝试:

  • 更新闪亮版本。
  • 原始帖子中的其他代码建议 - 没有变化
  • 使用 ...
    .ready(function(){$('input').on('shiny:inputchanged'
    ...而不仅仅是
    .on('shiny:inputchanged'
    .
  • 产生了一些(但不是全部)反应性。

我是 R 程序员,不是 JS 程序员。具有这两种技能的人可以建议如何使其发挥作用吗?

javascript r shiny
2个回答
3
投票

你需要排除输入,这是在JS部分设置的关于要监视的事件,否则你将陷入无限循环。

请查看我的相关答案这里

library(shiny)

ui <- fluidPage(
  tags$head(
    tags$script(
      "$(document).on('shiny:inputchanged', function(event) {
          if (event.name != 'changed') {
            Shiny.setInputValue('changed', event.name);
          }
        });"
    )
  ),
  numericInput("num1", "Numeric", 0),
  textInput("text1", "Text"),
  selectInput("select1", "Select", choices = LETTERS[1:4]),
  selectInput("selectize1", "Selectize", choices = letters[1:4]),
  
  textOutput("textout")
)

server <- function(input, output, session) {
  output$textout <- renderText({
    input$changed
  })
}

shinyApp(ui, server)

在这里可以找到相应的文档。


0
投票

这是与 @ismirsehregal 相同的答案,翻译为 python 的闪亮:

from shiny import App, render, ui, reactive

app_ui = ui.page_fluid(
    ui.tags.script('''
      $(document).on('shiny:inputchanged', function(event) {
          if (event.name != 'changed') {
            Shiny.setInputValue('changed', event.name);
          }
        });'''),
    ui.input_text("test", "Test"),
    ui.input_text("test2", "Test2"),
    ui.output_text_verbatim("changed"),
)

def server(input, output, session):
    @output
    @render.text
    def changed():
        return input.changed()

app = App(app_ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.