2

我已经构建了一个闪亮的应用程序,如果用户将非数字值输入到 numericInput 中,该应用程序会弹出消息。下面的代码就是这样做的(使用shinyBS),但它反应太快了。如果用户开始输入文本,但需要考虑一下要输入的数字,则会弹出消息。我希望在输入失去焦点时触发observeEvent,因此用户有时间输入完整值,并且只有当他们继续下一个输入时,observeEvent 才会处理错误。有什么建议么?shinyBS如果有更好的解决方案,我不喜欢使用,我像 4 年前一样构建了这个应用程序,从那时起,闪亮的宇宙已经有了很大的发展。

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)
4

1 回答 1

4

您最好的选择可能是使用一个小的自定义 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);
  });

});

然后在您的 UI 定义中使用并在服务器定义includeScript('www/customMessage.js')中将触发器从更改为input$valueinput$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)
于 2020-06-05T15:39:36.990 回答