Pembuatan dashboard saat ini sudah sangat dipermudah oleh AI seperti menggunakan excel, tableau, powerBI atau kalian suka coding bisa mengguanakan shiny (berbasis R ataupun Python).
Kebanyakan tutorial Rshiny banyak menggunakan logic yang langsung dihandle disatu kode App.R padahal kalau sering diakses oleh banyak user sekaligus tentu sangat memberatkan jikalau olah datanya didalam kode App.R itu sendiri.
Bilamana datanya sangat kecil dan didalamnya hanya isinya 1 tabel saja akan sangat berbeda sekali kalau ada ratusan ribu record dan join tabelnya sangat banyak (case nya kalian tidak bisa masuk kedalam sql sehingga hanya disediakan excel/csv saja atau bahkan dikasih data mentah nya) sehingga harus melakukan pre pengolahan dan join tabel di R sekaligus.
Untuk menyiasati hal demikian, saya menggunakan konsep rest api sebagai penyedia data nya sedangkan rshiny hanya bertugas melakukan visualisasi. Konsep ini seperti MVP yaitu model view controller.
Bagian logika pengolahan data akan diolah oleh rest api. Disini kalian banyak mengolah logika data, bilamana nanti perlu update harian bisa dilakukan secara manual menggunakan token atau mekanisme lainnya.
Sedangkan untuk view menggunakan Rshiny yang memanggil URL dengan return JSON/Data frame.
Dataset
Contents
berikut dataset yang digunakan terdiri dari 1 file xlsx yang disimpan dalam folder
New wpDataTable
Membuat Rest API
Library Rest API menggunakan plumber, simpan nama service.R
library(plumber)
library(dplyr)
library(readxl)
data = readxl::read_xlsx("data api.xlsx")
#* Memeriksa kesiapan API
#* @get /health
function() {
list(
status = "OK",
service = "Data Material Operation",
ready = TRUE
)
}
#* @get /data_produk
function(){
data %>%
group_by(`Nama Produk`) %>%
summarise(
`Kuantum` = sum(`Kuantum`,na.rm = TRUE),.groups="drop"
)
}
Run Server API
Kemudian kita membuat script buat run API tersebut diatas, simpan dengan nama run_api_demo.R
library(plumber)
api <- plumber::pr("service.R")
api$run(
host = "127.0.0.1",
port = 8000
)
Run saja dengan perintah source(“run_api_demo.R”)
maka akan tampil message di console
> source("run_api_demo.R")
Running plumber API at http://127.0.0.1:8000
Running swagger Docs at http://127.0.0.1:8000/__docs__/
Error reporting has been turned off by default. See `pr_set_debug()` for more details.
To disable this message, set a debug value.
This message is displayed once per session.
Mari kita panggil via curl, apakah sudah berjalan dengan baik
curl -X 'GET' \ 'http://127.0.0.1:8000/data_produk' \ -H 'accept: */*'
Hasilnya
[
{
"Nama Produk": "BEKATUL POLOS CURAH PSO DN",
"Kuantum": 49570
},
{
"Nama Produk": "BERAS MEDIUM HASIL GILING 25% POLOS 50 KG PSO DN",
"Kuantum": 227100
},
{
"Nama Produk": "MENIR POLOS CURAH PSO DN",
"Kuantum": 4270
}
]
Atau kalau mau yakin, buka saja pakai browser
http://127.0.0.1:8000/__docs__/
Memanggil API
untuk menarik data di R, gunakan kode berikut
library(httr)
library(jsonlite)
response <- GET("http://127.0.0.1:8000/data_produk")
stopifnot(status_code(response) == 200)
data_produk <- content(
response,
as = "text",
encoding = "UTF-8"
) %>%
fromJSON()
data_produk
Melalui mekanisme diatas, maka kita sudah memisahkan 2 hal yaitu view / dashboard untuk visualisasi dan logic sebagai pengolah datanya sebagai server tersendiri. Bisa saja suatu saat ada banyak perbaikan logic sebagai perkembangan bisnis maka kita juga bisa menerapkan mekanisme update data.
Membuat Rshiny
Mari kita buatkan rshiny untuk menampilkan hasil res api nya. Sekarang kita buat rshiny untuk menggunakan api diatas
library(shiny)
library(httr)
library(jsonlite)
library(DT)
ui <- fluidPage(
titlePanel("Data Produk"),
actionButton("refresh", "Muat Ulang Data"),
br(),
br(),
DTOutput("tabel_produk")
)
server <- function(input, output, session) {
data_produk <- eventReactive(input$refresh, {
response <- GET(
"http://127.0.0.1:8000/data_produk",
timeout(30)
)
stop_for_status(response)
fromJSON(
content(response, as = "text", encoding = "UTF-8"),
simplifyDataFrame = TRUE
)
}, ignoreNULL = FALSE)
output$tabel_produk <- renderDT({
datatable(
data_produk(),
options = list(
pageLength = 10,
scrollX = TRUE
),
rownames = FALSE
)
})
}
shinyApp(ui, server)

Mekanisme Update
Tentu kode API diatas belum dilengkapi dengan teknik update data, nah kalian bisa baca2 lagi digoogle atau chatgtp mengenai mekanisme update di plumber.