Cloud of words Shiny R

0

I'm wanting to make a word cloud using data from a postgresql table. I used an example as the base I found on the Shiny R website, but I can not do what I want.

I can not change which variable will serve as the basis of the word cloud. I needed that by changing the name in the selection in the "selectinput" the cloud should also change the variable that is used.

Server.R

function(input, output, session) {
# Define a reactive expression for the document term matrix
terms <- reactive({
# Change when the "update" button is pressed...
input$update
# ...but not for anything else
isolate({
  withProgress({
    setProgress(message = "Processing corpus...")
    getTermMatrix(input$selection)
  })
})
})

# Make the wordcloud drawing predictable during a session
wordcloud_rep <- repeatable(wordcloud)

output$plot <- renderPlot({
v <- terms()
wordcloud_rep(names(v), v, scale=c(4,0.5),
              min.freq = input$freq, max.words=input$max,
              colors=brewer.pal(8, "Dark2"))
})
}

Ui.R
fluidPage(
# Application title
titlePanel("Word Cloud"),

sidebarLayout(
# Sidebar with a slider and selection inputs
sidebarPanel(
  selectInput("selection", "Choose a book:",
              choices = c("Forzza","Viana")),
  actionButton("update", "Change"),
  hr(),
  sliderInput("freq",
              "Minimum Frequency:",
              min = 1,  max = 1000, value = 1),
  sliderInput("max",
              "Maximum Number of Words:",
              min = 1,  max = 100,  value = 100)
),

# Show Word Cloud
mainPanel(
 tabsetPanel(type = "tabs", 
     tabPanel("Plot", plotOutput("plot"))

)
)
)
)

Global.r
library(tm)
library(wordcloud)
library(memoise)

library(RPostgreSQL)
con <- dbConnect(PostgreSQL(), user="postgres",  password="123456",dbname="postgres")
coletor1=dbGetQuery(con,"SELECT REPLACE(aux_coletprinc,' ','')  aux_coletprinc  from jabot.detacesso2 where aux_coletprinc ilike '%forz%a%'
 limit 10")
coletor2=dbGetQuery(con,"SELECT REPLACE(aux_coletprinc,' ','')    aux_coletprinc  from jabot.detacesso2 where aux_coletprinc ilike '%vian%a%'
 limit 10")

dbDisconnect(con)

books <<- list("Forzza" ,
          "Viana" )


# Using "memoise" to automatically cache the results


getTermMatrix <- memoise(function(book) {
# Careful not to let just any name slip in here; a
# malicious user could manipulate this value.

text <- book    
myCorpus = Corpus(VectorSource(text))
myCorpus = tm_map(myCorpus, content_transformer(tolower))

myDTM = TermDocumentMatrix(myCorpus,
          control = list(minWordLength = 1))

m = as.matrix(myDTM)

sort(rowSums(m), decreasing = TRUE)
    
asked by anonymous 17.11.2016 / 01:43

1 answer

1

Your code has many problems. Here is a generic solution to the problem you described in the question: word cloud interactivity.

Since you have not reported any problems with reading the data, I have isolated the functions from RPostgreSQL and created "fantasy books". All you have to do is change the object books to something like books <<- list(coletor1, coletor2) .

library(tm)
library(wordcloud)
library(memoise)
library(shiny)
library(stringr)

books <- list(Forzza = c("Um", "monte", "de", "palavras"),
              Viana = c("Outro", "texto", "vai", "aqui", "palavras"))

getTermMatrix <- memoise(function(text) {
  myCorpus = Corpus(VectorSource(text))
  myCorpus = tm_map(myCorpus, content_transformer(tolower))

  myDTM = TermDocumentMatrix(myCorpus,
                             control = list(minWordLength = 1))

  m = as.matrix(myDTM)

  sort(rowSums(m), decreasing = TRUE)
})

server <- shinyServer(function(input, output, session) {
    terms <- reactive({
      input$update
      isolate({
        withProgress({
          setProgress(message = "Processing corpus...")
          getTermMatrix(books[[input$selection]])
        })
      })
    })

    wordcloud_rep <- repeatable(wordcloud)

    output$plot <- renderPlot({
      v <- terms()
      wordcloud_rep(names(v), v, scale=c(4,0.5),
                    min.freq = input$freq, max.words=input$max,
                    colors=brewer.pal(8, "Dark2"))
    })
})

ui <- shinyUI(fluidPage(
  titlePanel("Word Cloud"),

  sidebarLayout(
    sidebarPanel(
      selectInput("selection", "Choose a book:",
                  choices = c("Forzza","Viana")),
      actionButton("update", "Change"),
      hr(),
      sliderInput("freq",
                  "Minimum Frequency:",
                  min = 1,  max = 1000, value = 1),
      sliderInput("max",
                  "Maximum Number of Words:",
                  min = 1,  max = 100,  value = 100)
    ),

    mainPanel(
      tabsetPanel(type = "tabs", 
                  tabPanel("Plot", plotOutput("plot"))

      )
    )
  )
))

shinyApp(ui = ui, server = server)
    
17.11.2016 / 13:15