R 在屏幕上注册重复的键盘按键
我正在尝试构建一个捕获键盘按键的应用程序,但是我遇到了一个问题,即如果连续使用相同的键盘按键,那么shiny似乎不会注册输入。想知道是否有办法解决这个问题 这就是我的意思R 在屏幕上注册重复的键盘按键,r,shiny,R,Shiny,我正在尝试构建一个捕获键盘按键的应用程序,但是我遇到了一个问题,即如果连续使用相同的键盘按键,那么shiny似乎不会注册输入。想知道是否有办法解决这个问题 这就是我的意思 library(shiny) runApp( list(ui = bootstrapPage( verbatimTextOutput("results"), tags$script(' $(document).on("keydown", function (e) { Shiny.onInp
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'
只注册第一次上下击键,而忽略其余的击键 闪亮。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])
})
}
))
没错。这个变通方法也是我经常做的。我已经和Joe Cheng讨论过这个问题,它可能在某个时候被“修复”。谢谢你的回复@user5219763,尽管我不太确定我是否明白你的意思。您介意编辑提供的示例以实现此效果吗?可能不是最好的实现,但编辑应该可以工作。请随意评论github问题,以表明受此影响的人更多,这可能会促使他们将此作为更高的优先级:)