首页 > 解决方案 > Shiny 服务器中的 For 循环:如何在每次按下 ActionButton 时不覆盖值?

问题描述

我正在尝试创建一个应用程序,其中部分 UI 显示由用户输入的单词/字符串生成的 wordcloud。为此,我将输入传递给一个 for 循环,该循环应该将每个输入存储在一个空向量中,并且每次按下操作按钮。但是,我遇到了几个问题:一个是没有显示词云,没有指示错误,另一个是每次按下按钮时 for 循环只会覆盖矢量,因此它总是只有一个词,而不是逐渐添加更多的词。我认为缺少显示是因为只有一个词,而且 wordcloud 似乎需要至少两个词来打印任何内容:那么如何让 for 循环按预期与 Shiny 一起工作?

library(shiny)
library(stringr)
library(stringi)
library(wordcloud2)



ui <- fluidPage(

titlePanel("Strings Sim"),

 sidebarLayout(
 sidebarPanel(
  textInput("string.input", "Create a string:", placeholder = "string <-"),
  actionButton("go1", "GO!")
),

  mainPanel(
   textOutput("dummy"),
   wordcloud2Output("the.cloud")
  )


)
)

server <- function(input, output, session) {


 observeEvent(input$go1, {

   high.strung <- as.vector(input$string.input)
   empty.words <- NULL

for (i in high.strung) {
  empty.words <- c(empty.words, i)
}

word.vector <-matrix(empty.words, nrow = length(empty.words),ncol=1)

num.vector <- matrix(sample(1000), nrow=length(empty.words),ncol=1)

prelim <- cbind(word.vector, num.vector)

prelim.data <- as.data.frame(prelim)

prelim.data$V2 <- as.numeric(as.character(prelim.data$V2))

 output$the.cloud <- renderWordcloud2(
  wordcloud2(prelim.data)
   )

print(empty.words)
  })
  }

     shinyApp(ui=ui,server=server)

当我在没有闪亮代码的情况下运行它时,该操作按预期工作;我基本上只是用一个字符串代替输入,通过 for 循环运行几次以生成要供词云使用的数据帧,并得到类似于附件图片的内容,这就是我所追求的:示例输出

没有 Shiny 的功能代码:

 empty.words <- NULL

 #Rerun below here to populate vector with more words and regenerate wordcloud

 high.strung <- as.vector("gumbo")

 for (i in high.strung) {
   empty.words <- c(empty.words, i)
   return(empty.words)
 }

 word.vector <-matrix(empty.words, nrow = length(empty.words),ncol=1)

 num.vector <- matrix(sample(1000), nrow=length(empty.words),ncol=1)

 prelim <- cbind(word.vector, num.vector)

 prelim.data <- as.data.frame(prelim)

 prelim.data$V2 <- as.numeric(as.character(prelim.data$V2))

 str(prelim.data)

 wordcloud2(prelim.data)

任何帮助深表感谢!

编辑:使用非闪亮代码的所需输出的更多图片。(我编辑了数据框输出以覆盖 wordcloud 只是为了在一张图片中显示云和框架,即不需要它们以这种方式显示)。每次按下按钮,输入的单词都应该添加到构建云的数据框中,逐渐变大。确定大小的随机数向量不必每次按下都保持不变,但是每个输入的单词都应该保存在一个向量中。Ex2 Ex3

标签: for-loopshinywordcloud2

解决方案


您的应用缺少反应性。您可以在此处阅读有关该概念的信息。您可以输入字符串,只要数据框中至少有两个单词,就会呈现 wordcloud。如果您不想拆分多字字符串,只需取出该str_split()功能。

library(shiny)
library(stringr)
library(stringi)
library(wordcloud2)



ui <- fluidPage(

  titlePanel("Strings Sim"),

  sidebarLayout(
    sidebarPanel(
      textInput("string.input", "Create a string:", placeholder = "string <-"),
      actionButton("go1", "GO!")
    ),

    mainPanel(
      textOutput("dummy"),
      wordcloud2Output("the.cloud")
    )


  )
)

server <- function(input, output, session) {

  rv <- reactiveValues(high.strung = NULL)
  observeEvent(input$go1, {
    rv$high.strung <- c(rv$high.strung,str_split(c(input$string.input), pattern = " ") %>% unlist)
  })

  prelim.data <- reactive({
    prelim <- data.frame(
      word.vector = rv$high.strung, 
      num.vector = sample(1000, length(rv$high.strung), replace = TRUE)
    )
  })

  output$the.cloud <- renderWordcloud2(
    if (length(rv$high.strung) > 0)
      wordcloud2(prelim.data())
  )

}

shinyApp(ui=ui,server=server)

推荐阅读