Я пытаюсь создать приложение, в котором часть пользовательского интерфейса отображает облако слов, сгенерированное словами / строками, введенными пользователем. Для этого я передаю вход в цикл 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](https://i.stack.imgur.com/XWpiw.png)
Функциональный код без блеска:
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 только для того, чтобы показать облако и рамку на одном изображении, т.е. они не должны отображаться таким образом). При каждом нажатии кнопки введенное слово (слова) должно добавляться к кадру данных, который создает облако, постепенно увеличивая его. Вектор случайных чисел, который определяет размер, не должен оставаться неизменным при каждом нажатии, но каждое введенное слово должно быть сохранено в векторе.
![Ex3](https://i.stack.imgur.com/DZgPP.png)