r: Wordcloud приложения Shiny не отображает результаты

R новичок здесь...

Я пытаюсь создать облако слов в приложении rshiny.

Вот что у меня есть в моем ui.R:

       tabPanel("Word Cloud",
               sidebarLayout(
                 # Sidebar with a slider and selection inputs
                 sidebarPanel(

                   selectInput("Subcategory", "Choose a 
                                Subcategory:",
                               choices = makeup$SubCategory),
                   sliderInput("freq",
                               "Maximum Number of Words:",
                               min = 1,  max = 7, value = 5),
                   sliderInput("max",
                               "Minimum Frequency:",
                               min = 1,  max = 6000,  value = 1000)
                 ),
                 mainPanel(
                   plotOutput("plot")
                 ))  

Вот что у меня есть на моем server.R:

  shinyServer(function(input, output, session) {

         word = reactive({
         myCorpus = Corpus(VectorSource(subset(makeup, SubCategory == >              input$Subcategory, select = ChemicalName)))
         myCorpus = tm_map(myCorpus, content_transformer(tolower))
         myCorpus = tm_map(myCorpus, removePunctuation)
         myCorpus = tm_map(myCorpus, removeNumbers)
         myDTM = TermDocumentMatrix(myCorpus)
         m = as.matrix(myDTM)
         v = sort(rowSums(m),decreasing = TRUE)
         data.frame(word=names(v),freq=v)$word
         })

     freq = reactive({
         myCorpus = Corpus(VectorSource(subset(makeup, SubCategory == >              input$Subcategory, select = ChemicalName)))
         myCorpus = tm_map(myCorpus, content_transformer(tolower))
         myCorpus = tm_map(myCorpus, removePunctuation)
         myCorpus = tm_map(myCorpus, removeNumbers)
         myDTM = TermDocumentMatrix(myCorpus)
         m = as.matrix(myDTM)
         v = sort(rowSums(m),decreasing = TRUE)
         data.frame(word=names(v),freq=v)$freq
         })



      output$plot <- renderPlot({
         wordcloud(words = word, 
                    freq = freq, 
                    random.order=FALSE, rot.per=0.3,   
                    scale=c(4,.5),max.words=15, 
                    colors=brewer.pal(8,"Dark2"))
          })

Я не могу заставить свое блестящее приложение отображать облако слов...

Я также получаю предупреждающее сообщение:

. Предупреждение: ошибка в max: неверный тип (замыкание) аргумента

Любые идеи?!

Благодарю вас!


person bfflca    schedule 07.05.2018    source источник


Ответы (2)


реактивы - это функции, а не переменные. Попробуйте это - должно сработать.

output$plot <- renderPlot({
     wordcloud(words = word(), 
                freq = freq(), 
                random.order=FALSE, rot.per=0.3,   
                scale=c(4,.5),max.words=15, 
                colors=brewer.pal(8,"Dark2"))
      })
person Bertil Baron    schedule 08.05.2018

У @Bertil Baron есть правильный ответ на ваш самый насущный вопрос. Я подумал, что дам несколько советов по оптимизации вашего приложения/кода.

shinyServer(function(input, output, session) {

     word = reactive({
     myCorpus = Corpus(VectorSource(subset(makeup, 
                       SubCategory == > input$Subcategory, 
                       select = ChemicalName)))
     myCorpus = tm_map(myCorpus, content_transformer(tolower))
     myCorpus = tm_map(myCorpus, removePunctuation)
     myCorpus = tm_map(myCorpus, removeNumbers)
     myDTM = TermDocumentMatrix(myCorpus)
     #m = as.matrix(myDTM) ##this can cause an memory error if your corpus is even moderately sized.
     #row_sums from the slam package is much more efficient as it is designed to operate on sparse matrices and TDM/DTMs from the tm package are sparse matrices which are constructed using slam
     v = sort(slam::row_sums(myDTM),decreasing = TRUE)
     data.frame(word=names(v),freq=v) #Since you've already calculated frequency here there is no need for the freq reactive. We can just access the freq from this data.frame
     })

 #this is a redundant reprocessing of your corpus (which can be time consuming if it is big. 
 #freq = reactive({
 #    myCorpus = Corpus(VectorSource(subset(makeup, SubCategory == >              input$Subcategory, select = ChemicalName)))
 #    myCorpus = tm_map(myCorpus, content_transformer(tolower))
 #    myCorpus = tm_map(myCorpus, removePunctuation)
 #    myCorpus = tm_map(myCorpus, removeNumbers)
 #    myDTM = TermDocumentMatrix(myCorpus)
 #    m = as.matrix(myDTM)
 #    v = sort(rowSums(m),decreasing = TRUE)
 #    data.frame(word=names(v),freq=v)$freq
 #    })

  output$plot <- renderPlot({
     wordcloud(words = word()$word,
                freq = word()$freq, 
                random.order=FALSE, rot.per=0.3,   
                scale=c(4,.5),max.words=15, 
                colors=brewer.pal(8,"Dark2"))
      })
person emilliman5    schedule 08.05.2018
comment
Спасибо! Я попробовал эти данные, график появился. Однако на странице по умолчанию отображается ошибка, говорящая о недопустимом значении «cex». Также concole возвращаетWarning в max(freq) : нет непропущенных аргументов для max; возвращение -Inf Предупреждение в max(freq): нет непропущенных аргументов для max; return -Inf Предупреждение: ошибка в strwidth: неверное значение 'cex' Не могли бы вы помочь с этим? Большое спасибо! - person bfflca; 08.05.2018