R Shiny 应用 - 当用户下次触发应用刷新时,如何自动使用我的最新输出作为输入的一部分?



我是 Shiny 的新手,我正在构建一个带有文本框的 Shiny 应用程序。它用于预测文本,因此用户在此框中键入某些内容,应用调用一个函数,该函数返回用户当前正在键入的单词的一些可能性。

为此,它会扫描一些单词/单词序列文件,并提取一个子集,其中包含与用户到目前为止键入的内容(或部分键入的内容)匹配的所有行。

当用户继续键入时,并不总是需要重新打开和重新子集整个文件 - 如果我继续前进前一个子集,以便可以根据进一步的用户输入进一步对其进行子集,则此内容将运行得更快。考虑到这一点,我的函数返回一个列表,其中包含建议及其来源的子集。

如何使文件子集传递回函数,以便在用户键入下一个字符时使用?有没有人有一个简单的例子来做到这一点?

*附言我注意到有 20 个人在没有回复的情况下阅读了这篇文章,我问这个问题的方式有问题吗?

我已经实现了你的想法的一个最小示例。它将初始数据加载到全局变量中,反应块更新全局子列表变量。子列表写在主面板上,子列表的长度打印在控制台上,以指示列表实际上随着字母数量的增加而变短。

library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
textInput("text", "Text to be searched")
),
mainPanel(
textOutput("textOut")
)
)
)
server <- function(input, output) {
wordlist <- c("a", "ab", "abc", "abcd", "abcde", "different")
# With pre-defined file
# wordlist <- read.delim("/path/to/the/file.txt", header = FALSE, sep = ",")
sublist <- NULL
newList <- reactive({
if (input$text == ""){
sublist <<- wordlist
} else {
temp <- sublist
sublist <<- NULL
sublist <<- temp[grepl(input$text, temp)]
}
sublist
})
output$textOut <- renderText({
newList <- newList()
cat(paste("Length of the sublist is: ", length(sublist), "n"))
newList
})
}
shinyApp(ui = ui, server = server)

就其价值而言,使用全局变量递归执行此操作可能不是一个好主意(更改反应式中的全局变量总体上不是很好的做法,从搜索词中删除字母至少应该从头开始触发新的搜索等)。但作为基础,您不应该在每次用户输入新字母时打开并读取文件,列表应该只加载一次。跳过连续的文件打开/关闭将比使用子集对运行时间的影响更大。

相关内容

最新更新