【问题标题】:Shiny selectizeInput: Read current text闪亮的 selectizeInput:读取当前文本
【发布时间】:2021-05-16 14:56:06
【问题描述】:

使用闪亮的selectizeInput widget,用户可以输入文本以及从值列表中选择一个值。 R中有没有办法读取文本的当前值?

(已添加) 我应该明确指出,我希望能够阅读用户做出选择之前输入的文本。正如 zimia 指出的那样,在他做出选择之后,他选择的任何内容的值都可以作为 input$input_id 使用(假设 selectize 输入的 id 为“input_id”)。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    您可以只使用 input$input_id。见下文

    ui <- fluidRow(
      selectizeInput("input1","Enter Text",choices=c("A","B") ,options = list(create=TRUE)),
      textOutput("output1")
    )
    
    server<- function(input, output, session){
      output$output1 <- renderText({
        req(input$input1)
        input$input1
      })
    }
    

    【讨论】:

    • 不,在用户做出选择之前不会给出任何值。因此,例如,如果用户在 selectizeInput 文本框中键入“C”,直到他实际选择“添加”该值,input$input1 将为空。
    • 如果这是您想要的,那么您应该使用textInputselectizeInput 将包含在“添加”中。如果您希望在开始时有某个选择,您可以在 textInput() 函数中添加一个值。您能否从 UI 和服务器的角度提供一些关于您实际尝试实现的内容的背景信息,例如输入值将用于什么?
    • 我想到的特定应用程序查看用户的文本输入,然后计算完成列表,并为这些完成创建一个下拉菜单。我不想给出所有可能选择的完整列表,因为在我的应用程序中,这实际上可能是数百万种可能性。所以我的方法是等到用户输入了一定数量的字符,然后根据这些字符计算完成,并将它们添加到 selectizeInput 选项列表中。
    【解决方案2】:

    我在想会有一个 R/shiny 级别的解决方案。但我找到了一个使用 javascript 的解决方案。

        library(shiny)
        js <- '
          $(document).on("keyup", function(e) {
            minChars = 4;
            tag1 = document.activeElement.getAttribute("id");
            val1 = document.activeElement.value;
            if (tag1 == "input1-selectized") {
              if (Math.sign(val1.length +1 - minChars) == 1) {
                obj = { "val": val1 };
                Shiny.onInputChange("valueEntered", obj);
              }
            }
          });
    '
          ui <- fluidRow(
            tags$script(js),
            selectizeInput(
              "input1", 
              "Enter text", 
              choices = c("A", "B"), 
              options = list(create = FALSE)),
            textOutput("output1")
          )
    
          server <- function(input, output, session) {
            output$output1 <- renderText({
              req(input$valueEntered$val)
              input$valueEntered$val
            })
          }
      
          shinyApp(ui = ui, server = server)
    

    javascript 查找输入到 id 为“input1-selectized”的元素中的文本,如果该值的长度为 4 或更大,则将闪亮的变量“valueEntered”设置为 val = text 的对象。

    然后 observeEvent 使用闪亮的变量 input$valueEntered 来设置输出文本。

    javascript 中使用 Math.sign 函数而不是 > 的原因,以及嵌套 if 的原因是因为出于某种原因,Shiny 将 > 和 && 等中缀运算符替换为它们的 html 等效项,> 和 &&。

    请注意,如果 selectizeInput 小部件的 id 为“input1”,则相应的文本字段的 id 为“input1-selectized”。

    【讨论】:

    • 您可以使用tags$script(HTML(js))解决您遇到的javascript被误解的问题
    猜你喜欢
    • 2019-01-24
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多