将字符限制添加到R闪亮应用程序中的文本框中

时间:2018-01-06 18:37:08

标签: r shiny

我有一个带文字输入框的闪亮应用程序。我想限制可以输入的字符数,并在框下方显示一个注释,说明剩余多少个字符。我不确定如何防止输入的字符超过限制。我下面的代码,如果有效,只会显示剩余的字符数,但没有什么可以阻止它消极。

作为一个不太优选的解决方案,如果单击操作按钮并且输入框超过字符限制,我试图弹出一个模态框,但我无法使其工作。< / p>

ui <- fluidPage(title = "App Title",
                dashboardPage(title = "App Title",
                              dashboardBody(tabItems(tabItem(tabName = 'Tab1',
                                                             fluidRow(uiOutput('comment_UI'),
                                                                      actionButton('upload_comment', 'Upload Comment')
                                                                     ),
                                                             helpText(paste0('Characters remaining:', textOutput('charcount')))
                                                            )
                                                    )
                                            )
                              )
               )

server <- function(input, output, session) {

                output$comment_UI <- renderUI({textareaInput('comment','Comment')})

                output$charcount <- renderText({800-nchar(input$comment)})

                observeEvent(input$upload_comment, { 
                                 if(nchar(input$comment) <= 800) {
                                      [do stuff] }
                                 else {
                                      showModal(modalDialog(title = "Error",
                                                            "The character limit has been exceeded.")) }
                                                   }                  
                                           }

1 个答案:

答案 0 :(得分:2)

我在下面创建了一个没有javascript的解决方案,但它实际上更简单;与往常一样,shinyjs包可以大大简化:How to limit the number of characters accepted by textInput in Shiny app。在你的情况下。将shinyjs::runjs("$('#mytext').attr('maxlength',8)")添加到您的服务器。请注意,您应该将行library(shinyjs)useShinyjs()放在您的ui中,以便工作。

这是一个可能的解决方案,它使用您在解决方案中执行的observeEvent。每当使用超过字符限制时,观察者将输入重置为最大字符限制,弹出模态对话框,通知用户错误。

请注意,如果用户快速输入,用户仍可以输入15个字符。我认为使用一些自定义的javascript可以获得更好的解决方案,但我不是那方面的专家。希望这有帮助!

library(shiny)    

ui <- fluidPage(title = "App Title",
                textInput("mytext","Input text:"),
                textOutput('helptext')
)

max_char = 10

server <- function(input, output, session) 
{
  output$helptext <- reactive({ paste0('only ', max_char-nchar(input$mytext), ' characters remaining.' ) })

  observeEvent(input$mytext,{
    if(nchar(input$mytext)>max_char)
    {
      updateTextInput(session,'mytext',value=substr(input$mytext,1,max_char))
      showModal(modalDialog(
        title = "Error!",
        "Character limit exceeded!",
        easyClose = TRUE
      ))
    }
  }
  )

}
shinyApp(ui,server)