R Shiny:服务器端选择具有自定义相似性指标

时间:2018-10-06 09:15:47

标签: r shiny

目标:当用户在selectize输入中键入查询时,我想根据常规的字符串匹配以及过滤下拉列表自定义相似性指标。例如,如果用户键入“ Obama”,我希望建议包含“ Barack Obama”,“ Obamacare”等(字符串匹配)以及“总统”或“政客”(同义词)。

设置:同义词列表通过server.R中的某个函数实时返回,该函数将用户键入的内容作为输入。我认为我需要使用本教程中介绍的“服务器端选择”方法:https://shiny.rstudio.com/articles/selectize.html

  

客户端选择输入仅依靠JavaScript进行处理   搜索打字。 服务器端选择输入使用R进行处理   搜索,R将返回过滤后的数据以供选择。使用   服务器版本,您需要在UI中创建一个selectize实例,   并将其更新为服务器版本

问题

  • 当用户在文本框中键入字符串以提供功能时,如何访问该字符串?
  • 如何获取updateSelectizeInput函数以将函数返回的同义词列表考虑在内?

1 个答案:

答案 0 :(得分:0)

  

当用户在文本框中键入字符串以提供功能时,如何访问该字符串?

默认情况下,Selectize不会将数据发送回闪亮。您需要使用JS来获取它。

幸运的是,闪亮允许我们将选项传递给selectize构造函数。看selectize documentationloadonType似乎很有希望。每个input事件都会调用这两个事件。

  

如何获取updateSelectizeInput函数以将函数返回的同义词列表考虑在内?

然后,您可以获取JS,以使用JS控制的输入来告知selectize文本框的值,然后使用它来驱动updateSelectizeInput函数。参见communicating with js

如果您将JS的新选项列表提供给JS,您也可以跳过updateSelectizeInput并直接从javascript处理选项,但这似乎更加复杂。如果您想以这种方式进行操作,则需要使用this.removeOption或其他方法来摆脱旧值(API docs)。

将自定义JS添加到selectize元素的演示

library(shiny)

ui <- fillPage(
  selectizeInput("demo", "Filter with custom function",
                 c("Pre", "Provided", "Options"),
                 options = list(
                   load = I('function(input, callback) {
                                // input is the text in the select widget.
                                // callback in this case adds elements to the option list.

                                console.log(input, this)
                                callback([{"label": "Populated from js", "value": "Populated"}])
                            }'))
                 )
  )

server <- function(input, output) {
}

# Run the application
shinyApp(ui = ui, server = server)