如何使用JQuery触发按钮点击,在Shiny中触发observeEvent?

时间:2016-01-14 01:44:50

标签: jquery r shiny

让我们说我的应用中有两个actionButtons是左右箭头。他们习惯于浏览多个数据表和情节,并给出了一个"左"和#34;对"。我喜欢的是能够使用键盘上的箭头键进行导航。我以为我能够使用JQuery简单地触发这些按钮上的点击事件,但这似乎并没有传达给Shiny。

那么,我有不同的方式来做这件事吗?这是我目前正在使用的JQuery:

$(document.ready(function() {
    $("body").keydown(function(e) {
        if (e.which === 37) {
            $("#plot-left").trigger("click");
        } else if (e.which === 39) {
            $("#plot-right").trigger("click");
        }
     });
});

在Shiny的一面,我有这个代码:

  increase_counter <- function() {
    values$counter <- values$counter + 1
    if (values$counter > values$cluster_count) values$counter <- 1
  }

  decrease_counter <- function() {
    values$counter <- values$counter - 1
    if (values$counter == 0) values$counter <- values$cluster_count
  }

  observeEvent(input$plot_left, {
    decrease_counter()
  })

  observeEvent(input$plot_right, {
    increase_counter()
  })

修改

JQuery函数正在运行,通过在jquery中使用console.log()证明了这一点。问题是按下的触发按钮没有传回Shiny服务器,导致它运行命令。

这不是一个至关重要的功能,但它很难实现。谢谢!

2 个答案:

答案 0 :(得分:5)

你说你添加了一个console.log()语句,但我不知道它会如何起作用。您是否真的尝试通过在浏览器中打开JavaScript控制台来调试代码并尝试单步执行该功能?当我运行你的JS代码时,我发现它有一个小的语法错误。在document之后缺少结束括号。当我修复它,它工作正常。这是一个示例应用程序(请在下次包含一个完整的可重现示例,而不仅仅是服务器代码)

library(shiny)

jscode <- 
'
$(document).ready(function() {
$("body").keydown(function(e) {
if (e.which === 37) {
  $("#left").trigger("click");
} else if (e.which === 39) {
  $("#right").trigger("click");
}
});
});
'

ui <- fluidPage(
  tags$script(jscode),
  actionButton("left", "Left"),
  actionButton("right", "Right")
)

server <- function(input, output, session) {
  observeEvent(input$left, {
    cat("left\n")
  })
  observeEvent(input$right, {
    cat("right\n")
  })
}

shinyApp(ui = ui, server = server)

答案 1 :(得分:0)

试试这个

$("body").keydown(function(e) {
  if(e.keyCode == 37) { // left
    // click left
    });
  }
  else if(e.keyCode == 39) { // right
    // click right
  }
});