R Shiny Applications in Finance, Medicine, Pharma and Education Industry
Google Trend Visualization Application is the third application in this
book, the purpose of this application help the user explores the
gtrendsR
package
(https://github.com/PMassicotte/gtrendsR).
It is an interface for retrieving and displaying the information
returned online by Google Trends is provided. Trends (number of hits)
over the time as well as geographic representation of the results can be
displayed.
We will practice how to implement Google trend data into the app, create the information boxes with complex function, an US map, and 3D networks plot.
These are the features we cover in this chapter.
- User Inputs.
-
Add a search term with
textInput()
-
Google Product with
selectInput()
-
Time Period with
selectInput()
-
Specific Date with
dateRangeInput()
-
Add, Remove, Explore, Close, Download buttons with
actionButton
anddownloadButton
- The outputs.
-
Display the list of information boxes, which include the range of date, name of the key word, which date has the maximum of hits, the average of hits, and ranking between the keywords users provide.
-
There is an icon, which contains 2 buttons, one is Remove and another one is Explore. You either remove or explore more the subject you select.
-
US map represents the compare of the subjects by region. You will learn how to apply US map, add different colors, the hoover, and so on.
-
3D relative network plot, this is my favor plot, you will learn a lot about how the keywords connect.
-
The bar plot and line plot.
-
The last outputs contain the data table.
-
At the bottom of the application, there is a footer application.
- The layout of the app
The user inputs is on the right panel, the output is on the left panel.
Google Trend Visualization Application - Interface UI
Let’s start with the UI/frontend design, we have the user inputs i.e. add search term, Google product and period.
We already discussed the ShinyDashboard structure in the
@ref(stock-front-structure) session. So let’s move on to user input.
Let’s start with Add search term
, I used
pickerInput(inputId = "stickers",choices = sticker$symbol)
which put
the Sticker
data into global.R
. You can see the following codes,
choicesOpt = list(content = stringr::str_trunc(sticker$choices, width=30))
,
I wanted to cut the string of sticker$choices
with the width=30
textAreaInput("google_search","Add a search term",
value = "Amazon, Walmart, Best Buy, Target",height = "100px")
Google provided 5 different product choices for search, they are “Web”, “News”, “Images”, “Froogle”, “YouTube”. I used “web” by default
output$google_pro <- renderUI({
selectInput(
"product",
"Google product",
choices = c("web", "news", "images", "froogle", "youtube"),
selected = "web"
)
})
Google Products Input - Interface UI
There are many options for the time period that users choose. I used the
default library and two specific dates. If users select the second
option, another input parameter entered for duration will appear in the
Specific two dates
section.
I have provided 10 different choices for the time period, namely Last 12 months, Last hour, Last four hours, Last day, Last seven days and so on. By the way, you will see the line break between 2004 and the present and two specific dates. I just want to separate the default and manual date.
output$time <- renderUI({
selectInput(
"time",
"Time Period",
choices = c(
"Past 12 months" = "today 12-m",
"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",
"Last five years" = "today+5-y",
"2004 to present" = "all",
"------------------",
"Specific two dates" = "specific"
),
selected = "today 12-m",
multiple = F
)
})
Time Period Input - Interface UI
When the user selects Two specific dates
from Period
, the Dates
window is displayed. I used the dateRangeInput ()
function. This
specified two dates for the window, a start date and an end date. Better
than using dateInput()
output$spe_date <- renderUI({
req(input$time)
if(input$time == "specific")
dateRangeInput(
inputId = "dates",
label = "Date range",
start = "2018-04-15",
end = Sys.Date())
})
Google Specific Date - Interface UI
Let’s talk about the single box user interface. I start with the order
from top to bottom and left to right. I used width = 3
for each box.
In the next chapter @ref(google-server-boxes) you will learn how to
reply and apply user input to create these boxes.
Information Boxes - Interface UI
- The date
title = htmlOutput(paste("1", name[[a]]), style = "text-align:left;")
- I split the layout to 2 columns
cellWidths = c("70%", "30%")
- In the left column, it’s typical text information, so I used the
renderText()
to render andhtmlOutput()
to print out the output
- Name of the keyword
- Maximum hits
- Average hits.
- Rank
- In the right column
- There is an icon, which is
dropdownButton()
- When you click the icon, there are 2 buttons namely delete and
explore
actionButton()
buttons, I assignedonclick = 'Shiny.setInputValue(\"btnRem\", this.id, {priority: \"event\"})',
the button, useful for knowing which keyword we are citing.
box(
width = 3,
title = htmlOutput(paste("1", name[[a]]), style = "text-align:left;"),
splitLayout(
cellWidths = c("70%", "30%"),
tagList(
htmlOutput(name[[a]], style = "text-align:center;color:#32907c"),
htmlOutput(paste("2", name[[a]]), style = "text-align:left;padding-left:10px;"),
htmlOutput(paste("3", name[[a]]), style = "text-align:left;padding-left:10px;"),
htmlOutput(paste("5", name[[a]]), style = "text-align:left;padding-left:10px;"),
br()
),
div(
style = "text-align:right;height:150px;",
tags$style(
"#dropdown-menu-mydropdown2 {background-color: transparent;border-color: white;min-width:100px}
.btn-custom {background-color: transparent; color: #FFF;}.caret{display: none;}"
),
dropdownButton(
inputId = "mydropdown2",
label = "",
icon = icon("fas fa-ellipsis-v"),
status = "custom",
circle = FALSE,
actionButton(
paste0("delete_", group[[a]]),
"Remove ",
onclick = 'Shiny.setInputValue(\"btnRem\", this.id, {priority: \"event\"})',
style = "background-color: transparent;color:white;border-color: transparent;height:20px"
),
br(),
actionButton(
paste0("explore_", group[[a]]),
"Explore",
onclick = 'Shiny.setInputValue(\"btnExp\", this.id, {priority: \"event\"})',
style = "background-color: transparent;color:white;border-color: transparent;height:20px"
)
)
)
)
)
A US map figure used to compare keywords by region. In this case, use
LealetOutput(" map ", width =" 100% ", height =" 500px ")
to display
the map. Let’s use Amazon, Walmart, Best Buy, and Target as examples. I
chose blue for Amazon, orange for Wal-Mart, green for the best buy and
purple for the target audience.
The colors on the map represent the highest percentages of the area. Percentage calculated from a search of all four terms by state.
We will discuss more about how to apply the hoover on the back end of this chapter. You can use Google search to search for cities or states on the map.
And finally, a drop-down menu with the “Download” button will appear in the upper right corner of the box. Leave it as it is for now. Go back to the next chapter @ref(google-server-region) to understand the details.
Google Map - Interface UI
I used the networkD3
library and theforceNetwork()
function to create
the 3D relative network. It is quite complicated to process the data
before you even have a plot, you can read the next chapter
@ref(google-server-relative). We can learn how the relative keyword is
related, one thing for us is to look at it when analyzing.
Google Network Visualization - Interface UI
The bar graph represented the average number of results. The line graph
represented the number of hits per date. How to use plotly
for bar and
line charts we will learn in the next chapter
@ref(google-server-timeseries)
Google Trend Linechart - Interface UI
At the end of the output there are 2 tables, Breakdown Compared for
Related Searches and Breakdown Compared for Metropolitan Areas. Again,
we will use datatable
to create the tables. The next chapter @ref
(google-server-table) shows how to create these tables.
Tables - Interface UI