在 R Shiny 输入中按 Enter 键选择多个搜索关键字项目

问题描述 投票:0回答:2

我正在尝试使用输入的搜索关键字并按 Enter 选择关键字的所有匹配项目来选择 Shiny 的选择输入中的项目。

如果我提供列表中已存在的类似

observe
之类的项目,则代码片段中的
ALL
函数就可以工作,但我希望它适用于任何键入的关键字。例如
App
并按 Enter 键选择所有匹配的项目。

看看是否有其他自定义选项可以使用 jquery 或其他东西进行编码来捕获键入的输入并捕获过滤的项目,这将是很有趣的。或者可能是一些正则表达式,而不是我在

"ALL"
条件中使用的
if

    ---
    title: "search and select multiple items by pressing Enter"
    output: 
      flexdashboard::flex_dashboard:
        orientation: columns
        vertical_layout: fill
    runtime: shiny
    ---

    ```{r setup, include=FALSE}
    library(flexdashboard)
    ```

    Column {.sidebar data-width=300}
    -----------------------------------------------------------------------

    ```{r}
    #####################
    ### Reactive Parameters 

    Parameters <- reactive({
      c("ALL","Apple","App","Application","Approximate","Appointment","Ap_titude","Apricot","B","Ball","Bat","Battery")
    })

    output$params = renderUI({
      selectInput(
        'params',
        'Parameters',
        choices = Parameters(),
        multiple = TRUE,
        selectize = TRUE
      )
    })

    observe({
      if("ALL" %in% input$params){
        param_selection <- setdiff(Parameters(), "ALL")
      } else {
        param_selection <- input$params
      }
      updateSelectInput(session, "params", selected = as.character(unlist(param_selection)))
    })


    uiOutput("params")

    ```

    Column
    -----------------------------------------------------------------------

    ### Summary

    ```{r}

    ```
r shiny reactive-programming
2个回答
2
投票

我找到了 selectize.js 的帮助。它在 Shiny 的 selectize 页面上有超链接。

我最终使用

create
函数来让它工作。必须使用
callback
而不是
return
。基于搜索字符串的选择显示
undefined
,我无法让它显示正确的选择。但由于我有
observe
功能,通过它我可以
updateSelectInput
,所以我并不担心这一点。

这是我整理的示例代码。

    ---
    title: "search and select multiple items by pressing Enter"
    output: 
      flexdashboard::flex_dashboard:
        orientation: columns
        vertical_layout: fill
    runtime: shiny
    ---

    ```{r setup, include=FALSE}
    library(flexdashboard)
    library(dplyr)
    ```

    Column {.sidebar data-width=300}
    -----------------------------------------------------------------------

    ```{r echo=FALSE}
    #####################
    ### Reactive Parameters 

    Parameters <- reactive({
      c("ALL","Apple","App","Application","Approximate","Appointment","Ap_titude","Apricot","B","Ball","Bat","Battery")
    })

    output$params = renderUI({
      selectizeInput(
        'params',
        'Parameters',
        selected = NULL,
        choices = Parameters(),
        multiple = TRUE,
        options = list(
        delimiter= ',',
        persist= FALSE,
        create = I("function(input, callback) {
            callback({
                'value': input,
                'text': input
            });
        }")
        )    
      )
    })

    observe({
      dt <- as.character(unlist(Parameters()))
      if(is.null(input$params)){
        return()
      } else{
          if("ALL" %in% input$params){
            param_selection <- setdiff(dt, "ALL")
          } else {
            param_selection <- dt[grep(paste(input$params, collapse = "|"), dt)]
          }
      }
      updateSelectInput(session, "params", selected = as.character(unlist(param_selection)))
    })


    uiOutput("params")

    ```

    Column
    -----------------------------------------------------------------------

    ### Summary

    ```{r}

    ```

这是输出:

搜索字符串-“App”,添加它

单击“添加应用程序”时,观察函数触发器并将选择更新为与关键字匹配的所有值。

希望这可以帮助像我一样面临同样问题的其他人。


0
投票

这是 Tarun Parmar 调试后的代码,它可以工作(作为 rmarkdown/.rmd 文件)

---
title: "search and select multiple items by pressing Enter"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
runtime: shiny
---
    
```{r setup, include=FALSE}
library(flexdashboard)
library(dplyr)
```
    
Column {.sidebar data-width=300}
------------------------------------------------------------------
    
```{r echo=FALSE}
#####################
### Reactive Parameters 
    
Parameters <- reactive({
  c("ALL","Apple","App","Application","Approximate","Appointment","Atitude","Apricot","B","    Ball","Bat","Battery")
})
    
output$params = renderUI({
  selectizeInput(
    'params',
    'Parameters',
    selected = NULL,
    choices = Parameters(),
    multiple = TRUE,
    options = list(
      delimiter= ',',
      persist= FALSE,
      create = I("function(input, callback) {
        callback({
            'value': input,
            'text': input
        });
    }")
    )    
  )
})
browser()
    
observe({
  dt <- as.character(unlist(Parameters()))
  if(is.null(input$params)){
    return()
  } else{
    if("ALL" %in% input$params){
      param_selection <- setdiff(dt, "ALL")
    } else {
      browser()
      param_selection <- dt[grep(paste(input$params, collapse = "|"), dt)]
    }
  }
  updateSelectInput(session, "params", selected = as.character(unlist(param_selection)))
})
    
    
uiOutput("params")
    
```
    
Column
------------------------------------------------------------------
    
### Summary
    
```{r}
    
```
© www.soinside.com 2019 - 2024. All rights reserved.