Не уверен, как реализовать реактивное выражение в моем приложении Shiny - PullRequest
0 голосов
/ 15 марта 2020

Я довольно новичок в приложениях Shiny и до сих пор не совсем уверен, как реализовать реактивные выражения в моем приложении, несмотря на то, что прочитал несколько уроков, как это сделать. Вот моя попытка, которую я делаю так:

library(shiny)
library(tidyverse)

ui <- navbarPage(title = h1("Analysis of Anime"),
             tabPanel("Genre",
                 titlePanel("Visualizing Genre"),
                 sidebarLayout(
                   sidebarPanel(h4("Create plots of mean variables by genre."),
                                varSelectInput("var2", h5("Choose a variable to display."),
                                               data = anime %>% 
                                                 select(score, rank, popularity, members, favorites),
                                               selected = "popularity"),
                                sliderInput("toprange", h5("Display Top"),
                                            min = 5, max = 40, value = 5)),
                   mainPanel(plotOutput("bars"))
                   )
                 ), 
             tabPanel("Studio",
                  titlePanel("Visualizing Studios"),
                  sidebarLayout(
                   sidebarPanel("Create histograms of variables by studio.",
                                varSelectInput("var", h5("Choose a variable to display."),
                                               data = anime %>% select(score, rank, popularity,
                                                                       members, favorites))),
                                mainPanel(plotOutput("hist"))

                 )
        ),
            tabPanel("Synopsis",
                     titlePanel("Synopsis Search & Text Mining"),
                     sidebarLayout(
                       sidebarPanel("Search for most relevant animes.",
                                    textInput("word", h5("Input a word to search for.")),
                                    actionButton("submit", "Search")
                     ),
                     mainPanel(tableOutput("search"))
                )
            )
)

server <- function(input, output) {

  var2 <- reactive({input$var2})
  toprange <- reactive({input$toprange})
  var <- reactive({input$var})
  word <- reactive({input$word})

  output$bars <- renderPlot({
    genre_plot(var2(), toprange())
  })

  output$hist <- renderPlot({
    studio_plot(var())
  })

  output$search <- renderTable({
    word_freq(word())
  })
}

shinyApp(ui = ui, server = server)

Вот используемые функции:

library(tidyverse)
anime <- read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/
data/2019/2019-04-23/tidy_anime.csv")

genre_plot <- function(resp_variable, min) {
anime %>%
  group_by(genre) %>%
  drop_na(!!sym(resp_variable)) %>% 
  summarize(avg = mean(!!sym(resp_variable))) %>% 
  head(min) %>%
  ggplot(aes(x = reorder(genre, avg), y = avg)) +
  geom_col(fill = "cornflowerblue", color = "black") +
  labs(x = "Genre", y = paste("Mean", resp_variable)) +
  ggtitle(paste("Mean", resp_variable, "by genre")) +
  coord_flip() 
}

studio_plot <- function(resp_variable) {
  anime %>% 
    group_by(studio) %>% 
    drop_na(!!sym(resp_variable)) %>% 
    ggplot(aes(x = !!sym(resp_variable))) +
    geom_histogram(fill = "cornflowerblue") +
    labs(x = resp_variable, y = "Frequency") +
    ggtitle(paste("Frequency of", resp_variable))
}

word_freq <- function(word) {
  anime %>%
    distinct(name, .keep_all = TRUE) %>% 
    filter(str_detect(synopsis, word) | 
           str_detect(name, word)) %>% 
    select(name, synopsis)
}

Когда я это реализую, приложение работает нормально, но, кажется, все еще довольно медленно и sh иногда. Есть ли лучший способ написать это с помощью реактивных выражений?

1 Ответ

0 голосов
/ 16 марта 2020

На самом деле нет причин помещать переменные в реактивные выражения. Вы обычно помещаете свои таблицы в реактивные выражения, чтобы они могли использовать переменные динамически. Также fread из пакета data.table должен быть более эффективным, чем read_csv. Это будет выглядеть примерно так:

library(shiny)
library(tidyverse)
library(data.table)

anime <- fread("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-04-23/tidy_anime.csv")

ui <- navbarPage(title = h1("Analysis of Anime"),
                 tabPanel("Genre",
                          titlePanel("Visualizing Genre"),
                          sidebarLayout(
                            sidebarPanel(h4("Create plots of mean variables by genre."),
                                         varSelectInput("var2", h5("Choose a variable to display."),
                                                        data = anime %>% 
                                                          select(score, rank, popularity, members, favorites),
                                                        selected = "popularity"),
                                         sliderInput("toprange", h5("Display Top"),
                                                     min = 5, max = 40, value = 5)),
                            mainPanel(plotOutput("bars"))
                          )
                 ), 
                 tabPanel("Studio",
                          titlePanel("Visualizing Studios"),
                          sidebarLayout(
                            sidebarPanel("Create histograms of variables by studio.",
                                         varSelectInput("var", h5("Choose a variable to display."),
                                                        data = anime %>% select(score, rank, popularity,
                                                                                members, favorites))),
                            mainPanel(plotOutput("hist"))

                          )
                 ),
                 tabPanel("Synopsis",
                          titlePanel("Synopsis Search & Text Mining"),
                          sidebarLayout(
                            sidebarPanel("Search for most relevant animes.",
                                         textInput("word", h5("Input a word to search for.")),
                                         actionButton("submit", "Search")
                            ),
                            mainPanel(tableOutput("search"))
                          )
                 )
)

server <- function(input, output) {

  genre_plot <- reactive({
    anime %>%
      group_by(genre) %>%
      drop_na(!!sym(input$var2)) %>% 
      summarize(avg = mean(!!sym(input$var2))) %>% 
      head(input$toprange) %>%
      ggplot(aes(x = reorder(genre, avg), y = avg)) +
      geom_col(fill = "cornflowerblue", color = "black") +
      labs(x = "Genre", y = paste("Mean", input$var2)) +
      ggtitle(paste("Mean", input$var2, "by genre")) +
      coord_flip() 
  })

  studio_plot <- reactive({
    anime %>% 
      group_by(studio) %>% 
      drop_na(!!sym(input$var)) %>% 
      ggplot(aes(x = !!sym(input$var))) +
      geom_histogram(fill = "cornflowerblue") +
      labs(x = input$var, y = "Frequency") +
      ggtitle(paste("Frequency of", input$var))
  })

  word_freq <- reactive({
    anime %>%
      distinct(name, .keep_all = TRUE) %>% 
      filter(str_detect(synopsis, input$word) | 
               str_detect(name, input$word)) %>% 
      select(name, synopsis)
  })

  output$bars <- renderPlot({
    genre_plot()
  })

  output$hist <- renderPlot({
    studio_plot()
  })

  output$search <- renderTable({
    word_freq()
  })
}

shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...