Membuat dashboard dengan R Shiny
Hallo sahabat... tutorial kali ini kita akan mencoba membuat dashboard sederhana mengggunakan R Shiny.
R Shiny?
Shiny adalah paket R yang membuatnya mudah untuk membangun aplikasi web interaktif langsung dari R. Anda dapat meng-host aplikasi mandiri di halaman web atau menanamkannya dalam dokumen R Markdown atau membangun dashboard. Anda juga dapat memperluas aplikasi Shiny Anda dengan tema CSS, widget html, dan tindakan JavaScript (https://shiny.rstudio.com/).
Data:
Data yang digunakan adalah data COVID-19 yang dibuat oleh Rami Krispin package ‘coronavirus’ dan tersedia di https://github.com/RamiKrispin/coronavirus.
Yuk langsung saja…
Langkah 1: Importing data
Karena kita akan menggunakan data dari Rami Krispin maka kita perlu mengambil datanya dari github, gunakan perintah berikut.
devtools::install_github("RamiKrispin/coronavirus")
proses nya agak sedikit memakan waktu, maka diharapkan sabar menunggu. kemudian akan muncull tampilan berikut.
ketikkan 1 untuk mengudater semuanya. Jika telah berhasil maka panggilah package tersebut dengan perintah berikut.
library(coronavirus)
kemudian lakukan pengupdatean data (data berasal dari the Johns Hopkins University Center for Systems Science and Engineering (JHU CCSE)) menggunakan perintah berikut.
devtools::install_github("RamiKrispin/coronavirus")
arena kita akan menggunakan data dari Rami Krispin maka kita perlu mengambil datanya dari github, gunakan perintah berikut.
update_dataset()
akan memakan waktu cukup lama, jasi mohon bersabar lagi. jika sudah terupdate maka akan muncul tampilan berikut.
sekarang kita bisa menggunakan data coronavirus. Untuk melihat datanya gunakan perintah berikut.
View(coronavirus)
str(coronavirus)
Langkah 2: Membuat Dashboard
Dalam membuat dashboard terdapat 3 komponen penting, yaitu
- User Interface (ui)
- Server (server)
- ShinyApp (shinyapp)
User Interface (ui) merupakan fungsi yang mendefinisikan tampilan web dari aplikasi kita. Fungsinya memuat seluruh input dan output yang akan ditampilkan dalam app.
Server merupakan fungsi yang mendefinisikan logika kerja analysis dari sisi server pada aplikasi.
ShinyApp merupakan fungsi dari aplikasi yang memanggil UI dan Server untuk menjalankan aplikasi.
(sumber: https://medium.com/@986110101/bermain-dengan-r-shiny-b3430fc7ae5f)
sebelumnya kita akan memanggil beberapa packages yang aan digunakan. pastikan packages sudah terinstall pada r anda, jika belum terinstall dapat menggunakan perintah install.packages(“”).
library(shiny)
library(tidyverse)
library(shinydashboard)
library(rvest)
library(DT)
library(plotly)
selanjutnya masuk ke pembentukan daashbiard, berikut adalah script untuk bagian ui.
ui<-fluidPage(
dashboardPage( skin = "yellow",
dashboardHeader(title = "Informasi Virus Korona", titleWidth = 650),
dashboardSidebar(
sidebarMenu(id = 'sidebarmenu',
# first menu item
menuItem("Apa Itu Virus Korona?", tabName = "penjelasan1", icon = icon("question-circle")),
# second menu item with 2 sub menus
menuItem('chart',
icon = icon('bar-chart-o'),
menuSubItem('Sebaran di Indonesia',
tabName = 'chart1',
icon = icon('line-chart')),
menuSubItem('Sebaran di Dunia',
tabName = 'chart2',
icon = icon('line-chart'))),
menuItem("Database", tabName = "db", icon = icon("database"))
)),
dashboardBody(
tabItems(
tabItem("penjelasan1", h4("Coronavirus atau virus corona merupakan keluarga besar virus yang menyebabkan infeksi saluran pernapasan atas ringan hingga sedang, seperti penyakit flu. Banyak orang terinfeksi virus ini, setidaknya satu kali dalam hidupnya.")),
tabItem(tabName = "chart1",
# First Row
fluidRow(box(title = "Perbandingan Kasus positif dan Meninggal", plotlyOutput("plot1", height = 250), width = 12),
box(title = "Perbandingan Kasus Korona Beberapa Negara", plotlyOutput("plot2", height = 250),
width=6, solidHeader = F),
box(title = "Hubungan Kasus Positif dan Meninggal", plotlyOutput("plot3", height = 250)
))),
tabItem(tabName = "chart2",
# First Row
fluidRow(box(title = "Box with a plot", plotlyOutput("plot4", height = 450)), width = 12)),
tabItem(tabName = "db",
# First Row
fluidRow(tabBox(id="tabchart1",
tabPanel("World",DT::dataTableOutput("Tab1", height = "450px"), width = 9),
tabPanel("Indonesia",DT::dataTableOutput("Tab2", height = "450px"), width = 9), width = 12)))
))))
nomor 1 merupakan warna dashboardPage, nomor 2 merupakan pengaturan tulisan judul kepala, nomor 3 merupakan menu-menu, nomor 4 adalah pengaturan tata letak visualisasi.
kemudian tuliskan script untuk bagian server.
server<-shinyServer(function(input, output, session){
## Plotly Scatter Plot
output$plot3 <- renderPlotly({
plot_ly(data=df_indo,
x=~confirmed,
y=~death, color = "#8FBC8F",
type = "scatter",
mode = "markers")
})
#membandingkan kasus beberapa negara
output$plot2 <- renderPlotly({
df <- coronavirus %>%
dplyr::group_by(country, type) %>%
dplyr::summarise(total = sum(cases)) %>%
tidyr::pivot_wider(
names_from = type,
values_from = total
)
#membandingkan kasus
konfirmasi_harian <- coronavirus %>%
dplyr::filter(type == "confirmed") %>%
dplyr::filter(date >= "2020-06-25") %>%
dplyr::mutate(country = country) %>%
dplyr::group_by(date, country) %>%
dplyr::summarise(total = sum(cases)) %>%
dplyr::ungroup() %>%
tidyr::pivot_wider(names_from = country, values_from = total)
konfirmasi_harian %>%
plotly::plot_ly() %>%
plotly::add_trace(
x = ~date,
y = ~Austria,
type = "scatter",
mode = "lines+markers",
name = "Austria"
) %>%
plotly::add_trace(
x = ~date,
y = ~Philippines,
type = "scatter",
mode = "lines+markers",
name = "Philippines"
) %>%
plotly::add_trace(
x = ~date,
y = ~Singapore,
type = "scatter",
mode = "lines+markers",
name = "Singapore"
) %>%
plotly::add_trace(
x = ~date,
y = ~Indonesia,
type = "scatter",
mode = "lines+markers",
name = "Indonesia"
) %>%
plotly::layout(
title = "",
legend = list(x = 0.1, y = 0.9),
yaxis = list(title = "Kasus Positif"),
xaxis = list(title = "Tanggal"),
hovermode = "compare",
margin = list(
b = 10,
t = 10,
pad = 2
)
)
})
## Plot terkonfirmasi positif dan meninggal
output$plot1 <- renderPlotly({##tampilkan data
df <- coronavirus %>%
dplyr::filter(country == "Indonesia") %>%
dplyr::group_by(country, type) %>%
dplyr::summarise(total = sum(cases))
##Panggil nama tabel
#untuk mempercantik tabel
df <- coronavirus %>%
# dplyr::filter(date == max(date)) %>%
dplyr::filter(country == "Indonesia") %>%
dplyr::group_by(country, type) %>%
dplyr::summarise(total = sum(cases)) %>%
tidyr::pivot_wider(
names_from = type,
values_from = total
)
#melihat kasus corona perhari
##Data Harian
df_harian <- coronavirus %>%
dplyr::filter(country == "Indonesia") %>%
dplyr::filter(date >= "2020-03-01") %>%
dplyr::group_by(date, type) %>%
dplyr::summarise(total = sum(cases, na.rm = TRUE)) %>%
tidyr::pivot_wider(
names_from = type,
values_from = total
) %>%
dplyr::arrange(date) %>%
dplyr::ungroup() %>%
dplyr::mutate(active = confirmed - death) %>%
dplyr::mutate(
confirmed_cum = cumsum(confirmed),
death_cum = cumsum(death),
active_cum = cumsum(active)
)
##Plot Data Harian (mati dan terkonfirmasi)
confirmed_color <- "purple"
active_color <- "#7FFFD4"
recovered_color <- "forestgreen"
death_color <- "##B22222"
plotly::plot_ly(data = df_harian) %>%
plotly::add_trace(
x = ~date,
# y = ~active_cum,
y = ~confirmed_cum,
type = "scatter",
mode = "lines+markers",
name = "Terkonfirmasi Positif",
line = list(color = active_color),
marker = list(color = active_color)
) %>%
plotly::add_trace(
x = ~date,
y = ~death_cum,
type = "scatter",
mode = "lines+markers",
name = "Meninggal",
line = list(color = death_color),
marker = list(color = death_color)
) %>%
plotly::add_annotations(
x = as.Date("2020-03-02"),
y = 1,
text = paste("Kasus Pertama"),
xref = "x",
yref = "y",
arrowhead = 5,
arrowhead = 3,
arrowsize = 1,
showarrow = TRUE,
ax = -10,
ay = -80
) %>%
plotly::add_annotations(
x = as.Date("2020-03-11"),
y = 3,
text = paste("Kematian Pertama"),
xref = "x",
yref = "y",
arrowhead = 5,
arrowhead = 3,
arrowsize = 1,
showarrow = TRUE,
ax = -90,
ay = -90
) %>%
plotly::layout(
title = "",
yaxis = list(title = "Kasus Positif"),
xaxis = list(title = "Tanggal"),
legend = list(x = 0.1, y = 0.9),
hovermode = "compare"
)
})
## tabel selanjutnya jika ingin dimasukkan
output$plot4 <- renderPlotly({
})
## tabel 1
output$Tab1 <- DT::renderDataTable(DT::datatable({
data <-coronavirus }))
## tabel 2
output$Tab2 <- DT::renderDataTable(DT::datatable({
#filter indo
df_indo <- coronavirus %>%
dplyr::filter(country == "Indonesia") %>%
dplyr::filter(date >= "2020-03-01") %>%
dplyr::group_by(date, type) %>%
dplyr::summarise(total = sum(cases, na.rm = TRUE)) %>%
tidyr::pivot_wider(
names_from = type,
values_from = total
) %>%
dplyr::arrange(date) %>%
dplyr::ungroup() %>%
dplyr::mutate(active = confirmed - death) %>%
dplyr::mutate(
confirmed_cum = cumsum(confirmed),
death_cum = cumsum(death),
active_cum = cumsum(active)
)
data <-df_indo }))
})
nomor 1 merupakan fungsi logika, nomor 2 merupakan visualisasi scatter plot yang kemudian akan tersamung pada UI dengan kata kunci plot3, nomor 3 merupakan visualisasi linechart perbandingan beberapa negara tetangga Indonesia yang kemudian akan tersamung pada UI dengan kata kunci plot2.
kemudian run aplikasi dengan perintah berikut.
shinyApp(ui,server)
akan muncul tampilan berikut,
jika ingin melihat dashboard menggunakan browser, dapat pilih Open in Browser.
gambar diatas merupakan tampilan awal dashboard yang diberi judul “Informasi Virus Korona”. Tampilan awl dashboard menampikan menu Apa itu Virus Korona. Jika meng-klik menu Chart maka akan tampil sub menu sebagai berikut.
sub menu pertama yaitu Sebaran di Indonesia yang menampilakan visualisasi mengenai virus korona khususnya di Indonesia.
sub menu kedua yaitu Sebaran di Dunia masih belum terisi visualisasi.
menu terakhir yaitu Database yang menampilkan data COVID-19 di Dunia dan terdapat juga tabel khusus Indonesia. Tabel juga dilengkapi pilihan pencarian jika ingin melakukan pencarian pada data.
oke Dashboard yang kita inginan sudah jadi :)
terimakasih .. semoga bermanfaat dan silahkan lakukan pengembangan lebih lanjut mengenai rshiny.
staysafe.. semoga wabah ini cepat mereda agar kita bisa beraktifitas seperti biasa