闪亮服务器中的 For 循环:如何在每次按下 ActionButton 时不覆盖值?
For Loop in Shiny Server: How to Not Overwrite Values with Each ActionButton Press?
我正在尝试创建一个应用程序,其中 UI 的一部分显示由用户输入的 words/strings 生成的词云。为此,我将输入传递给一个 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)
当我 运行 没有 Shiny 代码时,操作按预期工作;我基本上只是用一个字符串代替输入,运行通过for循环几次生成词云使用的dataframe,得到类似附图的东西,这就是我所追求的:
没有 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 只是为了在一张图片中显示云和框架,即不需要它们以这种方式显示)。每次按下按钮,输入的单词都应该添加到构建云的数据框中,逐渐使其成为 larger.The 决定大小的随机数向量不必在每次按下时保持相同,但是每个输入的单词都应该保存在一个向量中。
您的应用缺少反应性。您可以阅读有关该概念的文章 here。您可以输入字符串,只要数据框中至少有两个单词,就会呈现词云。如果您不想 multi-word 字符串被拆分,只需取出 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)
我正在尝试创建一个应用程序,其中 UI 的一部分显示由用户输入的 words/strings 生成的词云。为此,我将输入传递给一个 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)
当我 运行 没有 Shiny 代码时,操作按预期工作;我基本上只是用一个字符串代替输入,运行通过for循环几次生成词云使用的dataframe,得到类似附图的东西,这就是我所追求的:
没有 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 只是为了在一张图片中显示云和框架,即不需要它们以这种方式显示)。每次按下按钮,输入的单词都应该添加到构建云的数据框中,逐渐使其成为 larger.The 决定大小的随机数向量不必在每次按下时保持相同,但是每个输入的单词都应该保存在一个向量中。
您的应用缺少反应性。您可以阅读有关该概念的文章 here。您可以输入字符串,只要数据框中至少有两个单词,就会呈现词云。如果您不想 multi-word 字符串被拆分,只需取出 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)