r while循环内部观察功能没有正常破坏

时间:2017-06-15 18:33:06

标签: r while-loop output break reactive

编辑添加可重现的代码

我正在构建一个Shiny应用程序,并在observe函数中遇到了 while 循环的问题。在while循环后,程序不显示无功值。以下是ui.r和server.r

的相关代码片段

ui.r

library(shiny)
shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
       textAreaInput("inText", label = "Enter text", rows = 3),
       submitButton("Predict")
    ),

    mainPanel(
      textOutput("outText"),
      textOutput("outCount"),
      textOutput("outPred")
    )
  )
))

Server.r

library(shiny)
library(stringr)

predict <- function(term)
{
  if(term == 3)
    table <- list()
  else
    if(term == 0)
      table <- c("input","text","empty")
    else
      table <- c("words","were","found")
  return(table)
}

shinyServer(
  function(input, output) {
    state <- reactiveValues()
    observe({
      state$inText <- input$inText
      state$wcount <- sapply(gregexpr("[[:alpha:]]+", state$inText), function(x) sum(x > 0))

      if( state$wcount > 2)
        term.c <- 3
      else
        if( state$wcount == 2)
          term.c <- 2
        else
          if( state$wcount == 1)
            term.c <- 1
          else
            term.c <- 0
      cont <- TRUE

      while(cont == TRUE) {
        if(term.c == 3) {
          state$predList <- predict(term.c)
          if(length(state$predList) > 0) break
          else term.c <- 2
        }
        if(term.c == 2) {
          state$predList <- predict(term.c)
          if(length(state$predList) > 0) break
          else term.c <- 1
        } 
        if(term.c == 1) {
          state$predList <- predict(term.c)
          if(length(state$predList) > 0) break
          else term.c <- 0
        } 
        if(term.c == 0) {
          state$predList <- c("Did", "not", "find", "term")
          break
        }
      }
    })
    output$outText <- renderPrint({ input$inText })
    output$outCount <- renderPrint({ sapply(gregexpr("[[:alpha:]]+", input$inText), function(x) sum(x > 0)) })
    output$outPred <- renderPrint({ state$predList })
  }
)

输入两个单词并正确显示值。输入三个单词,一个空列表返回到$ predList状态,这将给它一个0长度。然后程序应该执行第二个if语句,并使用非零长度列表填充状态$ predList。发生这种情况但显示从未刷新,程序进入无限循环。它跳转到observe函数的第一行并继续无限循环。我在添加browser()时看到了这一点。

我没有正确使用反应值吗?感谢您的帮助。

0 个答案:

没有答案