|
library(shiny) |
|
library(shinyalert) |
|
library(shinythemes) |
|
library(shinycssloaders) |
|
library(shinyjs) |
|
library(httr) |
|
library(bslib) |
|
library(thematic) |
|
library(gtrendsR) |
|
library(plotly) |
|
library(dplyr) |
|
library(ggplot2) |
|
|
|
options(spinner.color = "lightblue", |
|
spinner.color.background = "#ffffff", |
|
spinner.size = 2) |
|
|
|
my_theme <- bs_theme( |
|
bg = "#fdfefe", |
|
fg = "blue", |
|
primary = "red", |
|
base_font = font_google("PT Sans Caption"), |
|
"font-size-base" = "0.9rem", |
|
version = 5, |
|
"navbar-bg" = "blue" |
|
) |
|
|
|
thematic_shiny() |
|
|
|
ui <- list(useShinyjs(),navbarPage(windowTitle = "TrendChecker", |
|
title = strong("TrendChecker"),theme = my_theme, |
|
tabPanel(title = strong("Trend Over Time"),icon = icon("chart-line"), |
|
sidebarLayout( |
|
sidebarPanel(width = 3,actionButton("info",strong("About TrendChecker",icon("info"))),hr(), |
|
hidden(tags$div(id = "about",h5("TrendChecker is a web application that enables users to monitor the search popularity of any subject of interest over time, |
|
and across different countries by calling the Google trend api. Search hit of 100 is the indicator of optimum popularity, while other hits are measured relative to the optimum."))),h4(strong("Controls")),hr(), |
|
textInput("text",strong("Enter Search Term"),value = "Soccer"), |
|
checkboxGroupInput("check",strong("Select Country(ies)"),choices = c("USA" = "US","UK" = "GB","Germany" = "DE","Netherlands" = "NL","Nigeria" = "NG","Japan" = "JP"),selected = "US"), |
|
radioButtons("radio",strong("Choose Trend Source"),choices = c("Web","News","YouTube","Images"),selected = "News"), |
|
radioButtons("time",strong("Select Time Frame"),choices = c("Last Hour","Last Four Hours","Last Day","Last Seven Days","Past 30 Days","Past 90 Days","Past 12 Months","Last Five Years"),selected = "Last Seven Days"), |
|
actionButton("run",strong("Run Query"),icon("caret-right")) |
|
), |
|
mainPanel( |
|
withSpinner(plotlyOutput("plot"),type = 8)) |
|
|
|
)) |
|
)) |
|
|
|
|
|
|
|
server <- function(input, output,session) { |
|
|
|
|
|
|
|
observeEvent(input$info,{ |
|
toggle("about") |
|
}) |
|
|
|
|
|
|
|
|
|
check_input <- reactive(input$check) |
|
|
|
|
|
radio_input <- reactive(switch(input$radio, |
|
"Web" = "web", |
|
"News" = "news", |
|
"YouTube" = "youtube", |
|
"Images" = "images")) |
|
|
|
radio_time <- reactive(switch(input$time, |
|
"Last Hour" = "now 1-H", |
|
"Last Four Hours" = "now 4-H", |
|
"Last Day" = "now 1-d", |
|
"Last Seven Days" = "now 7-d", |
|
"Past 30 Days" = "today 1-m", |
|
"Past 90 Days" = "today 3-m", |
|
"Past 12 Months" = "today 12-m", |
|
"Last Five Years" = "today+5-y")) |
|
|
|
|
|
|
|
text_input <- reactive(input$text) |
|
|
|
|
|
|
|
|
|
|
|
|
|
trend <- function(){ |
|
|
|
gt <- gtrends(keyword = c(text_input()),geo = c(check_input()),gprop = radio_input(), |
|
time = radio_time()) |
|
|
|
p <- plot(gt) |
|
|
|
gp <- ggplotly(p) |
|
|
|
return(gp) |
|
} |
|
|
|
|
|
|
|
trend2 <- reactive(trend()) |
|
|
|
|
|
|
|
output$plot <- renderPlotly({ |
|
|
|
withProgress(message = "Fetching data", |
|
detail = "This may take a while...",value = 0,{ |
|
|
|
for (i in 1:25){ |
|
|
|
incProgress(1/25) |
|
Sys.sleep(0.25) |
|
} |
|
}) |
|
|
|
input$run |
|
isolate(trend2()) |
|
|
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
shinyApp(ui = ui, server = server) |
|
|