Манипулирование данными при реактивном событии

Я создаю фрейм данных, который создается динамически, когда пользователь вводит поисковый запрос, для этого у меня есть кнопка действия, а фрейм данных создается при нажатии кнопки «перейти».

Как только это будет сделано, мне нужно выполнить различные манипуляции с данными в DF и вывести разные графики.

Я изо всех сил пытаюсь понять, как я обрабатываю данные в Shiny, у меня есть упрощенный пример кода ниже:

library(shiny)
library(sp)
library(stringr)
library(tidyr)
library(tidyverse)
library(tm)
library(ggplot2)
library(stringi)
library(plyr)
library(dplyr) 

ui <- fluidPage(

  fluidRow( 
    column( 4, titlePanel("Twitter Analytics")),
    column( 3),
    column( 4, 
            textInput("searchstring", 
                      label = "",
                      value = "")),
    column(1, 
           br(),
           actionButton("action", "go"))
  ),
  fluidRow(
    column( 12, tabsetPanel(
      tabPanel("one",
               fluidRow(
                 column(3 ),
                 column(9,  plotOutput("ttext"))
               )
      ),    
      tabPanel("two"),
      tabPanel("three")
    )
    )
  )
)

server <- function(input, output) {

  tweet <- eventReactive(input$action,{
    num <- c(1,2,3,4,50)
    text <- c("this is love love something", "this is not hate hate hate something", "@something islove  rethched this not", " Shiny is love confusing me", "this is hate also somthing difficult")
    letter<- c("a", "b", "c", "D", "e")
    tweetdf <- data.frame(num, text, letter)
  })

  tdm <- if( is.null(tweetdf) ){return()}
  else{
    tweetdf$text <- tolower(tweetdf$text)
    # tweetdf @UserName
    tweetdf$text <- gsub("@\\w+", "", tweetdf$text)
    #remove punctuation
    tweetdf$text <- gsub("[[:punct:]]", "", tweetdf$text)
    #remove links
    tweetdf$text <- gsub("http\\w+", "", tweetdf$text)
    # Remove tabs
    tweetdf$text <- gsub("[ |\t]{2,}", "", tweetdf$text)
    # Remove blank spaces at the beginning
    tweetdf$text <- gsub("^ ", "", tweetdf$text)
    # Remove blank spaces at the end
    corpus <- iconv(tweetdf$text, to = "ASCII")
    corpus <- Corpus(VectorSource(corpus))
    corpus <- tm_map(corpus, removePunctuation)
    corpus <- tm_map(corpus, removeNumbers)
    cleanset <- tm_map(corpus, removeWords, stopwords('english'))
    tdm <- TermDocumentMatrix(cleanset)
    tdm <- as.matrix(tdm)
    w <- rowSums(tdm)
  }

    output$ttext <- renderPlot({ 
        library(RColorBrewer)
        barplot(w)

    })
    output$wordCl <- renderPlot({
      library(wordcloud2)
      w <- data.frame(names(w), w)
      colnames(w) <- c('word', 'freq')
      wordcloud2(w,
                 color = 'random-dark',
                 size = 0.7,
                 shape = 'circle',
                 rotateRatio = 0.5,
                 minSize = 1)
    })
  }

  shinyApp(ui, server)

Я все время получаю сообщение об ошибке, что tweetdf не существует. Этого не должно быть, пока пользователь не введет поисковый запрос и не нажмет "перейти"

Как лучше всего подойти к этой проблеме, подходящее ли это место для этого?


person Pythonuser    schedule 08.06.2019    source источник


Ответы (1)


Он сообщает вам, что tweetdf не существует, потому что результат eventReactive (tweetdf) присваивается переменной tweet, что делает твит вашей фактической реактивной переменной с результатом tweetdf in.

Также проблема в вашем коде заключается в том, что вы смешиваете классические переменные с реактивными переменными.

Вы можете получить доступ к реактивным переменным, добавив круглые скобки в конце переменной ()

Вот рабочий пример:

library(shiny)
library(sp)
library(stringr)
library(tidyr)
library(tidyverse)
library(tm)
library(ggplot2)
library(stringi)
library(plyr)
library(dplyr) 
library(RColorBrewer)
library(wordcloud2)

ui <- fluidPage(

  fluidRow( 
    column( 4, titlePanel("Twitter Analytics")),
    column( 3),
    column( 4, 
            textInput("searchstring", 
                      label = "",
                      value = "")),
    column(1, 
           br(),
           actionButton("action", "go"))
  ),
  fluidRow(
    column( 12, tabsetPanel(
      tabPanel("one",
               fluidRow(
                 column(3 ),
                 column(9,  plotOutput("ttext"))
               )
               # ,fluidRow(wordcloud2Output("wordCl"))
      ),    
      tabPanel("two"),
      tabPanel("three")
    )
    )
  )
)

server <- function(input, output) {

  w <- eventReactive(input$action,{
    num <- c(1,2,3,4,50)
    text <- c("this is love love something", "this is not hate hate hate something", "@something islove  rethched this not", " Shiny is love confusing me", "this is hate also somthing difficult")
    letter<- c("a", "b", "c", "D", "e")
    tweetdf <- data.frame(num, text, letter)

    tdm <- if( is.null(tweetdf) ){return()} ## should not use return here as this is not a function
    else{
      print(tweetdf)
      tweetdf$text <- tolower(tweetdf$text)
      # tweetdf @UserName
      tweetdf$text <- gsub("@\\w+", "", tweetdf$text)
      #remove punctuation
      tweetdf$text <- gsub("[[:punct:]]", "", tweetdf$text)
      #remove links
      tweetdf$text <- gsub("http\\w+", "", tweetdf$text)
      # Remove tabs
      tweetdf$text <- gsub("[ |\t]{2,}", "", tweetdf$text)
      # Remove blank spaces at the beginning
      tweetdf$text <- gsub("^ ", "", tweetdf$text)
      # Remove blank spaces at the end
      corpus <- iconv(tweetdf$text, to = "ASCII")
      corpus <- Corpus(VectorSource(corpus))
      corpus <- tm_map(corpus, removePunctuation)
      corpus <- tm_map(corpus, removeNumbers)
      cleanset <- tm_map(corpus, removeWords, stopwords('english'))
      tdm <- TermDocumentMatrix(cleanset)
      tdm <- as.matrix(tdm)
      w <- rowSums(tdm)
    }

  })

  output$ttext <- renderPlot({ 
    barplot(w())
  })


  output$wordCl <- renderWordcloud2({
    w <- data.frame(names(w()), w())

    colnames(w) <- c('word', 'freq')

    wordcloud2(w,
               color = 'random-dark',
               size = 0.7,
               shape = 'circle',
               rotateRatio = 0.5,
               minSize = 1)
  })
}

shinyApp(ui, server)

person Junior Hechinger    schedule 08.06.2019
comment
Привет, @Junior Hechinger, я вижу, что вы переместили событие обработки данных в реактивное событие. Причина, по которой я переместил его из реактивного события, заключается в том, что я хочу выполнить множество различных манипуляций с DF, каждая из которых будет загружена в разные графы, то есть wordcloud, сеть, хлороплет. Так что мой вопрос действительно в том, как я могу выполнить эту сложную манипуляцию с данными в блестящем состоянии ??? Я действительно понятия не имею - person Pythonuser; 09.06.2019
comment
Вы можете выполнять сложные манипуляции с данными в реактивной переменной и возвращать результаты для разных графиков. Самый простой способ сделать это - чтобы ваше реактивное событие возвращало не только DF, но и список DF. Где каждый элемент списка является результатом некоторых вычислений. Другой способ сделать это - использовать reactiveValues ​​(), который ведет себя как список реактивных значений. - person Junior Hechinger; 09.06.2019
comment
Спасибо за указания, которые вы предоставили, я считаю, что это должно направить меня по правильному пути. - person Pythonuser; 09.06.2019