目标:当用户在selectize
输入中键入查询时,我想根据常规的字符串匹配以及过滤下拉列表自定义相似性指标。例如,如果用户键入“ Obama”,我希望建议包含“ Barack Obama”,“ Obamacare”等(字符串匹配)以及“总统”或“政客”(同义词)。
设置:同义词列表通过server.R
中的某个函数实时返回,该函数将用户键入的内容作为输入。我认为我需要使用本教程中介绍的“服务器端选择”方法:https://shiny.rstudio.com/articles/selectize.html:
客户端选择输入仅依靠JavaScript进行处理 搜索打字。 服务器端选择输入使用R进行处理 搜索,R将返回过滤后的数据以供选择。使用 服务器版本,您需要在UI中创建一个selectize实例, 并将其更新为服务器版本
问题:
updateSelectizeInput
函数以将函数返回的同义词列表考虑在内?答案 0 :(得分:0)
当用户在文本框中键入字符串以提供功能时,如何访问该字符串?
默认情况下,Selectize不会将数据发送回闪亮。您需要使用JS来获取它。
幸运的是,闪亮允许我们将选项传递给selectize构造函数。看selectize documentation,load
和onType
似乎很有希望。每个input
事件都会调用这两个事件。
如何获取
updateSelectizeInput
函数以将函数返回的同义词列表考虑在内?
然后,您可以获取JS,以使用JS控制的输入来告知selectize文本框的值,然后使用它来驱动updateSelectizeInput
函数。参见communicating with js。
如果您将JS的新选项列表提供给JS,您也可以跳过updateSelectizeInput
并直接从javascript处理选项,但这似乎更加复杂。如果您想以这种方式进行操作,则需要使用this.removeOption
或其他方法来摆脱旧值(API docs)。
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)