R 闪亮:使用自定义相似度指标进行服务器端选择



目标:当用户在输入中键入查询selectize,我想根据通常的字符串匹配以及自定义相似性指标过滤下拉列表。例如,如果用户键入"奥巴马",我希望建议包含"巴拉克奥巴马","奥巴马医改"等(字符串匹配(,但也包含"总统"或"政治家"(同义词(。

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

客户端选择输入完全依赖于JavaScript来处理 在打字时搜索。服务器端选择输入使用R 进行处理 搜索,R将返回过滤后的数据进行选择。要使用 服务器版本,需要在UI中创建一个选择实例, 并将其更新到服务器版本

问题

  • 如何访问用户在文本框中键入的字符串以馈送我的函数?
  • 如何让updateSelectizeInput函数考虑函数返回的同义词列表?

如何访问用户在文本框中键入的字符串以馈送我的函数?

默认情况下,Selectize 不会将该数据发送回 Shiny。你需要用JS获取它。

幸运的是,shiny 允许我们将选项传递给 selectize 构造函数。查看选择文档,loadonType似乎很有希望。每个input事件都会调用这些。

如何让updateSelectizeInput函数考虑函数返回的同义词列表?

然后,你可以让你的JS用JS控制的输入通知shiny选择文本框的值,并使用它来驱动你的updateSelectizeInput函数。请参阅与 js 通信。

如果你给JS新选项的列表,你也可以跳过updateSelectizeInput并直接从javascript操作选项,但这似乎更复杂。如果你想这样做,你需要使用this.removeOption或其他东西来摆脱旧的值(API文档(。

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

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)

最新更新