2014-10-06 16 views
6

Ho avuto una piccola domanda. Ho provato a fare molte ricerche ma non ho avuto fortuna. C'è un modo in cui R-shiny deve catturare un doppio clic su un elemento come un pulsante.Doppio clic in R-lucido

risposta

12

Ecco un modo per farlo. La chiave è rilevare l'evento dblclick sul lato client (ad esempio, ui), quindi richiamare Shiny.onInputChange per aggiornare il valore di una variabile R, che può quindi essere prelevata dal server.

Ecco cosa succede quando si fa doppio clic sul pulsante.

  1. Il valore viene incrementato di 1
  2. Il valore incrementato viene utilizzato per aggiornare la variabile x.
  3. Il server rileva la modifica in x
  4. Il server aggiorna 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

Ho aggiornato la mia risposta in base al commento qui sotto. Qui ho usato una soglia di differenza di tempo di 0,2 secondi per distinguere tra un doppio orologio e un clic regolare. Ho usato un approccio leggermente diverso nella mia app. Ho semplicemente controllato quante volte il pulsante è stato premuto controllando se è divisibile per 2 o meno.

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 due clic singoli NON equivalgono a un doppio clic. – Ramnath

+0

@Ramnath Ho aggiornato la mia risposta per includere la soglia temporale del "doppio clic" –

Problemi correlati