【问题标题】:Add character limit to a text box in an R shiny app向 R 闪亮应用程序中的文本框添加字符限制
【发布时间】:2018-06-16 06:27:07
【问题描述】:

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

作为一个不太可取的解决方案,如果单击操作按钮并且输入框超过字符限制,我试图弹出一个模式框,但我也无法让它工作。

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.")) }
                                                   }                  
                                           }

【问题讨论】:

标签: r shiny


【解决方案1】:

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


这是一个可能的解决方案,它像您在解决方案中所做的那样使用观察事件。每当 used 超过字符限制时,观察者将输入重置为最大字符限制,并弹出一个模式对话框,通知用户错误。

请注意,如果用户输入速度很快,他仍然可以输入 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)

【讨论】:

  • 谢谢,我得到了剩余字符的显示。不幸的是,模态对话框仍然无法正常工作。每当它应该出现时,应用程序就会崩溃,这就是之前发生的事情。我会继续修改它,但你的解决方案让我走上了正轨。
猜你喜欢
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2018-07-14
  • 1970-01-01
  • 2021-08-30
  • 2016-12-20
  • 2016-09-04
相关资源
最近更新 更多