2014-10-06 93 views
6

我有一个小问题。我已经尝试过很多研究,但我没有运气。有没有一种方法R-shiny必须捕获像按钮之类的元素的双击。双击R-shiny

回答

12

这是一种方法。关键是检测客户端的dblclick事件(即ui),然后调用Shiny.onInputChange来更新R变量的值,然后可以由服务器接收该值。

这是按钮被双击时发生的情况。

  1. 的值由1
  2. 递增该递增的值被用于更新可变x
  3. 服务器检测到更改x
  4. 服务器更新textOutput
library(shiny) 

ui = bootstrapPage(
    tags$button(id = 'mybutton', 'button', class='btn btn-primary', value = 0), 
    textOutput('x'), 
    # when button is double clicked increase the value by one 
    # and update the input variable x 
    tags$script(" 
    $('#mybutton').on('dblclick', function(){ 
     var val = +this.value 
     this.value = val + 1 
     Shiny.onInputChange('x', this.value) 
     console.log(this.value) 
    }) 
    ") 
) 

server = function(input, output, session){ 
    output$x <- renderText({ 
    input$x 
    }) 
} 

runApp(list(ui = ui, server = server)) 
0

我基于下面的评论更新我的答案。在这里,我使用0.2秒的时间差的阈值来区分双时钟和常规点击。我在我的应用程序中使用稍微不同的方法我只需检查按钮被按下的次数是否可以被2整除。

library(shiny) 
t1 <<- Sys.time() 

ui =fluidPage(
    actionButton("my_button", "Dont Touch it!"), 
    mainPanel(textOutput("x")) 
) 
server = function(input, output, session){ 
    my_data <- reactive({ 
    if(input$my_button == 0) 
    { 
     return() 
    } 

    if(input$my_button%%2!=0) 
    {  
     t1 <<- Sys.time() 
    } 
    if(input$my_button%%2==0 & (Sys.time() - t1 <= 0.2)) 
    {  
     "You pushed the button twice!" 
    } 
    }) 
    output$x <- renderText({my_data()}) 
} 
runApp(list(ui = ui, server = server)) 
+0

AFAIK两次单击不等于双击。 – Ramnath 2014-10-06 16:49:30

+0

@Ramnath我已经更新了我的答案,包括“双击”的时间阈值, – 2014-10-06 17:05:59