如何使用反应函数在 R Shiny 中创建 DF
How to use a reactive function to create a DF in R Shiny
在完成 DataCamp 课程后,我正在尝试创建一个闪亮的 wordcloud 应用程序。在课程中,他们使用自定义 create_wordcloud()
函数来制作应用程序。如果有人有它的代码,它会让我的生活更轻松。
无论如何,我正在尝试按照自己的方式行事,因为我没有自定义函数,将使用 wordcloud2()
函数。
我在使用反应函数制作 Shiny 应用程序时遇到了问题。从本质上讲,我试图做到这一点,以便用户可以 select 单词的数量并使用 UI 更改 wordcloud 中的背景。为此,我需要将用户提供的文本转换为数据框,按字数对 df 进行排序,然后将 df 子集化为用户 select 在应用程序中的任何数字 UI .
这是我的代码:
library(shiny)
library(colourpicker)
library(tidyverse)
ui <- fluidPage(
h1("Word Cloud"),
sidebarLayout(
sidebarPanel(
# Add a textarea input
textAreaInput("text", "Enter text", rows = 7),
numericInput("num", "Maximum number of words", 25),
colourInput("col", "Background color", value = "white")
),
mainPanel(
wordcloud2Output("cloud")
)
)
)
server <- function(input, output) {
df_data <- reactive({
input$text %>%
term_stats(., drop_punct = TRUE, drop = stopwords_en) %>%
order_by(desc(count))
})
output$cloud <- renderWordcloud2({
# Use the textarea's value as the word cloud data source
wordcloud2(data = df_data()[1:input$num, ],
backgroundColor = input$col)
})
}
shinyApp(ui = ui, server = server)
我得到的错误是:
Warning: Error in : Input must be a vector, not a function.
我真的很期待听到社区的答案并提高我的响应式编程技能!
谢谢!
方案一:获取实际代码create_wordcloud
函数如下:
create_wordcloud <- function(data, num_words = 100, background = "white") {
# If text is provided, convert it to a dataframe of word frequencies
if (is.character(data)) {
corpus <- Corpus(VectorSource(data))
corpus <- tm_map(corpus, tolower)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("english"))
tdm <- as.matrix(TermDocumentMatrix(corpus))
data <- sort(rowSums(tdm), decreasing = TRUE)
data <- data.frame(word = names(data), freq = as.numeric(data))
}
# Make sure a proper num_words is provided
if (!is.numeric(num_words) || num_words < 3) {
num_words <- 3
}
# Grab the top n most common words
data <- head(data, n = num_words)
if (nrow(data) == 0) {
return(NULL)
}
wordcloud2(data, backgroundColor = background)
}
方案二:评论区@Xiang提供:
ui <- fluidPage(
h1("Word Cloud"),
sidebarLayout(
sidebarPanel(
# Add a textarea input
textAreaInput("text", "Enter text", rows = 7),
numericInput("num", "Maximum number of words", 25),
colourInput("col", "Background color", value = "white")
),
mainPanel(
wordcloud2Output("cloud")
)
)
)
server <- function(input, output) {
df_data <- reactive({
input$text %>%
term_stats(., drop_punct = TRUE, drop = stopwords_en) %>%
arrange(desc(count))
})
output$cloud <- renderWordcloud2({
# Use the textarea's value as the word cloud data source
wordcloud2(data = df_data()[1:input$num, ],
backgroundColor = input$col)
})
}
shinyApp(ui = ui, server = server)
在完成 DataCamp 课程后,我正在尝试创建一个闪亮的 wordcloud 应用程序。在课程中,他们使用自定义 create_wordcloud()
函数来制作应用程序。如果有人有它的代码,它会让我的生活更轻松。
无论如何,我正在尝试按照自己的方式行事,因为我没有自定义函数,将使用 wordcloud2()
函数。
我在使用反应函数制作 Shiny 应用程序时遇到了问题。从本质上讲,我试图做到这一点,以便用户可以 select 单词的数量并使用 UI 更改 wordcloud 中的背景。为此,我需要将用户提供的文本转换为数据框,按字数对 df 进行排序,然后将 df 子集化为用户 select 在应用程序中的任何数字 UI .
这是我的代码:
library(shiny)
library(colourpicker)
library(tidyverse)
ui <- fluidPage(
h1("Word Cloud"),
sidebarLayout(
sidebarPanel(
# Add a textarea input
textAreaInput("text", "Enter text", rows = 7),
numericInput("num", "Maximum number of words", 25),
colourInput("col", "Background color", value = "white")
),
mainPanel(
wordcloud2Output("cloud")
)
)
)
server <- function(input, output) {
df_data <- reactive({
input$text %>%
term_stats(., drop_punct = TRUE, drop = stopwords_en) %>%
order_by(desc(count))
})
output$cloud <- renderWordcloud2({
# Use the textarea's value as the word cloud data source
wordcloud2(data = df_data()[1:input$num, ],
backgroundColor = input$col)
})
}
shinyApp(ui = ui, server = server)
我得到的错误是:
Warning: Error in : Input must be a vector, not a function.
我真的很期待听到社区的答案并提高我的响应式编程技能!
谢谢!
方案一:获取实际代码create_wordcloud
函数如下:
create_wordcloud <- function(data, num_words = 100, background = "white") {
# If text is provided, convert it to a dataframe of word frequencies
if (is.character(data)) {
corpus <- Corpus(VectorSource(data))
corpus <- tm_map(corpus, tolower)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("english"))
tdm <- as.matrix(TermDocumentMatrix(corpus))
data <- sort(rowSums(tdm), decreasing = TRUE)
data <- data.frame(word = names(data), freq = as.numeric(data))
}
# Make sure a proper num_words is provided
if (!is.numeric(num_words) || num_words < 3) {
num_words <- 3
}
# Grab the top n most common words
data <- head(data, n = num_words)
if (nrow(data) == 0) {
return(NULL)
}
wordcloud2(data, backgroundColor = background)
}
方案二:评论区@Xiang提供:
ui <- fluidPage(
h1("Word Cloud"),
sidebarLayout(
sidebarPanel(
# Add a textarea input
textAreaInput("text", "Enter text", rows = 7),
numericInput("num", "Maximum number of words", 25),
colourInput("col", "Background color", value = "white")
),
mainPanel(
wordcloud2Output("cloud")
)
)
)
server <- function(input, output) {
df_data <- reactive({
input$text %>%
term_stats(., drop_punct = TRUE, drop = stopwords_en) %>%
arrange(desc(count))
})
output$cloud <- renderWordcloud2({
# Use the textarea's value as the word cloud data source
wordcloud2(data = df_data()[1:input$num, ],
backgroundColor = input$col)
})
}
shinyApp(ui = ui, server = server)