2016-03-06 35 views
4

我試圖建立一個應用程序,其中鍵盤按下被捕獲,但我遇到的問題,如果相同的鍵盤按下連續使用然後閃亮似乎並沒有註冊輸入。想知道是否有辦法解決這個問題。例如:註冊重複的鍵盤按下閃亮

例如,這是我的意思。

library(shiny) 
runApp(list(ui = bootstrapPage(
    verbatimTextOutput("results"), 
    tags$script(' 
    $(document).on("keydown", function (e) { 
     Shiny.onInputChange("down", e.which); 
    });'), 
    tags$script(' 
    $(document).on("keyup", function (e) { 
       Shiny.onInputChange("up", e.which); 
       });') 
) 
, server = function(input, output, session) { 

    output$results = renderPrint({ 
     print(rnorm(1)) 
     c(input$down, input$up) 
    }) 
} 
)) 

打字/鍵盤上的釋放不同的字符生成新的輸入,因此,當這些事件發生時的隨機數生成器被調用。但是打字時,比方說,'g''g''g'只記錄第一個上下鍵擊並忽略其餘部分。

回答

5

Shiny.onInputChange只有當JS對象它引用改變反應,但你寫你的js方式的價值被重新分配到具有相同鍵的多次按壓同樣的事情。 一個醜陋的解決方法可能是使變量成爲按鍵和數組中的隨機浮動。

library(shiny) 
runApp(list(ui = bootstrapPage(
    verbatimTextOutput("results"), 
    tags$script(' 
       $(document).on("keydown", function (e) { 

       Shiny.onInputChange("down", [e.which,Math.random()]); 
       });'), 
    tags$script(' 
       $(document).on("keyup", function (e) { 

       Shiny.onInputChange("up", [e.which,Math.random()]); 
       });') 
) 
, server = function(input, output, session) { 

    output$results = renderPrint({ 
    print(rnorm(1)) 
    c(input$down[1], input$up[1]) 
    }) 
} 
)) 

消除生成隨機數的需要並傳遞一些潛在有用的信息可能更有效。例如使用timestamp屬性,您可以在按鍵上實現一些過濾。

library(shiny) 
runApp(list(ui = bootstrapPage(
    verbatimTextOutput("results"), 
    tags$script(' 
      $(document).on("keydown", function (e) { 

      Shiny.onInputChange("down", [e.which,e.timeStamp]); 
      });'), 
tags$script(' 
      $(document).on("keyup", function (e) { 

      Shiny.onInputChange("up", [e.which,e.timeStamp]); 
      });') 
) 
, server = function(input, output, session) { 

    output$results = renderPrint({ 
    print(rnorm(1)) 
    c(input$down[1], input$up[1]) 
    }) 
} 
)) 
+1

這是正確的。這種解決方法也是我總是這樣做的。我已經和Joe Cheng討論過這個問題,可能會在某個時候「固定」。 [這是github的問題](https://github.com/rstudio/shiny/issues/928) –

+0

感謝回覆@ user5219763,雖然我不太確定我是否按照你的意思。你介意編輯提供的例子來達到這個效果嗎? – philchalmers

+0

也許不是最好的實現,但編輯應該工作。 – user5219763