我构建了一个闪亮的应用程序,如果用户在 numericInput 中输入非数字值,它会显示一条弹出消息。下面的代码就是这样做的(使用shinyBS),但反应太快了。如果用户开始输入文本,但需要考虑一下要输入的数字,则会弹出该消息。我希望observeEvent在输入失去焦点时触发,以便用户有时间输入完整值,并且只有当他们转到下一个输入时observeEvent才会处理错误。有什么建议么?shinyBS如果有更好的解决方案,我不会执意使用,我在 4 年前就构建了这个应用程序,从那时起,Shiny 宇宙已经有了相当大的发展。
library(shinyBS)
library(shiny)
ui<-shinyUI(fluidPage(
fluidRow(
numericInput("value","My Value",value=0),
bsModal("number_Message", "", trigger="", size = "small","This field only accepts numeric values.")
)
))
server<-shinyServer(function(input, output, session){
output$value<-renderText({input$value})
observeEvent(input$value,{
# browser()
if(is.na(as.numeric((input$value)))==T){
toggleModal(session, "number_Message",toggle="toggle")
updateNumericInput(session,"value","My Value",value=0)
}
})
})
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
您最好的选择可能是使用一个小的自定义 js 脚本来注册失去焦点的事件处理程序。然后,回调可以向 Shiny 发送自定义消息或直接在客户端触发对话框。
假设您仍然希望服务器处理它,请在您的www目录中创建一个单独的文件
// www/customMessage.js
$(document).ready(function() {
// initialize a counter
var n = 0;
// create a handler
$("#value").on("blur", function(){
// increment the counter each time input loses focus
n++;
// send message to Shiny
Shiny.onInputChange("count", n);
});
});
Run Code Online (Sandbox Code Playgroud)
然后在您的 UI 定义中使用并在服务器定义中将includeScript('www/customMessage.js')触发器从 更改为input$value。input$count
我很高兴您没有执着于shinyBS,因为它与添加事件处理程序的jquery 功能相混淆。还有其他选择,但 Shiny 也有原生模式。总而言之,您的应用程序代码看起来类似于
library(shiny)
ui <- shinyUI(fluidPage(
includeScript("www/customMessage.js"),
fluidRow(
numericInput("value","My Value",value=0)
)
))
server<-shinyServer(function(input, output, session){
output$value<-renderText({input$value})
observeEvent(input$count,{
if(is.na(as.numeric((input$value)))==T){
showModal(modalDialog(
title = "Invalid Input",
"This field only accepts numeric values."
))
updateNumericInput(session,"value","My Value",value=0)
}
})
})
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)