Я довольно новичок в приложениях 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 иногда. Есть ли лучший способ написать это с помощью реактивных выражений?