Для цикла в Shiny Server: как не перезаписывать значения при каждом нажатии кнопки ActionButton? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь создать приложение, в котором часть пользовательского интерфейса отображает облако слов, сгенерированное словами / строками, введенными пользователем. Для этого я передаю вход в цикл 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 несколько раз, чтобы сгенерировать фрейм данных, который будет использоваться облаком слов, и получу что-то похожее на прикрепленную картинку, что я и ищу: Example Output

Функциональный код без блеска:

 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)

Любая помощь очень ценится!

Редактировать: больше изображений желаемого выхода, используя не блестящий код. (Я отредактировал вывод dataframe так, чтобы он перекрывал wordcloud только для того, чтобы показать облако и рамку на одном изображении, т.е. они не должны отображаться таким образом). При каждом нажатии кнопки введенное слово (слова) должно добавляться к кадру данных, который создает облако, постепенно увеличивая его. Вектор случайных чисел, который определяет размер, не должен оставаться неизменным при каждом нажатии, но каждое введенное слово должно быть сохранено в векторе. Ex2 Ex3

1 Ответ

0 голосов
/ 14 июня 2019

В вашем приложении отсутствует реактивность. Вы можете прочитать об этой концепции здесь . Вы можете ввести строки, и как только в кадре данных появится хотя бы два слова, 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)
...