如何使文本输出更快?

5

我正在尝试创建一个仅将文本添加到主面板的应用程序。然而,添加文本时文本输出非常缓慢。

我想使它变得即时和快速,而不是花费这么多时间。是否有一种方法可以在浏览器中处理它,而不是去R语言?

代码

library(shiny)

ui <- fluidPage(sidebarLayout(
  sidebarPanel(textInput("text", label = NULL)),
  mainPanel(textOutput("textout"))
))


server <- function(input, output, session) {
  
  output$textout <- renderText({
    input$text
  })
}

shinyApp(ui, server)

enter image description here


我没有解决方案,但我认为被限制的是 textInput 而不是输出。找不到任何改变这种行为的方法。 - pseudospin
2个回答

4
这是由于shiny使用输入方式的原因。在javascript中,它有一个选项,'debounce'为250ms,这就解释了为什么只有在停止打字四分之一秒后才更新。

您可以覆盖此设置,但似乎需要编写textInput的替代方案。关键部分是javascript中的getRatePolicy函数。 enter image description here
library(shiny)
library(shinyCustom)

textinput_script <- "
<script>
var customTextInputBinding = $.extend({}, Shiny.inputBindings.bindingNames['shiny.textInput'].binding, {
  find: function(scope) {
    return $(scope).find('input.customTextInput');
  },
  subscribe: function(el, callback) {
    $(el).on('keyup.customTextInputBinding input.customTextInputBinding', function(event) {
      callback();
    });
    $(el).on('focusout.customTextInputBinding', function(event) { // on losing focus
      callback();
    });
  },
  unsubscribe: function(el) {
    $(el).off('.customTextInputBinding');
  },
  getRatePolicy: function() {
    return {
      policy: 'direct'
    };
  }
});

Shiny.inputBindings.register(customTextInputBinding, 'shiny.customTextInput');
</script>
"

ui <- fluidPage(sidebarLayout(
  sidebarPanel(
    HTML(textinput_script),
    customTextInput("text", label = NULL)
  ),
  mainPanel(textOutput("textout"))
))

server <- function(input, output, session) {
  output$textout <- renderText({
    input$text
  })
}

shinyApp(ui, server)

这是从这里剽窃的,而一般执行此操作的实际指南在这里


我想要做相反的事情,即增加getRatePolicy,但是当我尝试你的代码时,我收到了这个错误:Error in customTextInput("text", label = NULL) : could not find function "customTextInput" - Quixotic22
如果包含 library(shinyCustom),似乎它又可以工作了。 - pseudospin

1
这种方法并不是像@pseudospins的高质量回答那样去寻找延迟的原因,而是使用了一个支撑。它是一种纯粹基于shiny的解决方案,这就是为什么它可能仍然具有一定的兴趣。
它使用了“更贪婪”的reactivePoll。检查函数总是产生TRUE,以确保在每个轮询间隔后无论如何都会评估input$text。参数intervalMillis可以更改以适应应用程序的要求。在这里,它设置为0.1秒。
请注意,这种方法简单有效,但如果过度使用它可能会使您的应用程序变得非常慢。check参数可能是节省资源的机会。您可以尝试存储上一个字符串的长度,并将其与新状态进行比较,每隔intervalMillis个时间间隔执行一次。然而,在这个简单的例子中,我怀疑这不会起太大作用。
library(shiny)

ui <- fluidPage(sidebarLayout(
  sidebarPanel(textInput("text", label = NULL)),
  mainPanel(textOutput("textout"))
))


server <- function(input, output, session) {
  text <- reactivePoll(intervalMillis = 100, session, 
                       checkFunc = function() TRUE, 
                       valueFunc = function () input$text
                      )
  
  output$textout <- renderText({
    text()
  })
}

shinyApp(ui, server)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接