## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
eval = FALSE
)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_fillable(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# padding = "1rem",
# card(
# card_header("DT2 in Shiny"),
# card_body(dt2_output("my_table"))
# )
# )
#
# server <- function(input, output, session) {
# output$my_table <- render_dt2({
# dt2(iris, options = list(pageLength = 10))
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_fillable(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# padding = "1rem",
# card(
# card_header("Table State"),
# card_body(dt2_output("tbl"))
# ),
# card(
# card_header("Current state"),
# card_body(verbatimTextOutput("state_info"))
# )
# )
#
# server <- function(input, output, session) {
# output$tbl <- render_dt2({
# dt2(iris, options = list(pageLength = 10))
# })
#
# output$state_info <- renderPrint({
# state <- input$tbl_state
# if (is.null(state)) return("(interact with the table)")
# cat("Reason:", state$reason, "\n")
# cat("Page:", state$page$page + 1, "of", state$page$pages, "\n")
# cat("Search:", if (nzchar(state$search)) state$search else "(none)", "\n")
# cat("Order:", paste(state$order, collapse = ", "), "\n")
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_sidebar(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# title = "Proxy Demo",
# sidebar = sidebar(
# actionButton("refresh", "Refresh data", class = "btn-sm btn-outline-primary w-100 mb-2"),
# actionButton("go_last", "Go to last page", class = "btn-sm btn-outline-primary w-100 mb-2"),
# actionButton("sort_sl", "Sort Sepal.Length \u2193", class = "btn-sm btn-outline-primary w-100 mb-2"),
# hr(),
# textInput("search_text", "Search", placeholder = "e.g. setosa"),
# actionButton("search_btn", "Apply", class = "btn-sm btn-primary w-100")
# ),
# card(
# card_body(dt2_output("tbl"))
# )
# )
#
# server <- function(input, output, session) {
# output$tbl <- render_dt2({
# dt2(iris, options = list(pageLength = 10))
# })
#
# proxy <- dt2_proxy("tbl")
#
# observeEvent(input$refresh, {
# new_data <- iris[sample(nrow(iris), 50), ]
# dt2_replace_data(proxy, new_data)
# })
#
# observeEvent(input$go_last, {
# dt2_proxy_page(proxy, "last")
# })
#
# observeEvent(input$sort_sl, {
# dt2_proxy_order(proxy, c("Sepal.Length", "desc"),
# columns = names(iris))
# })
#
# observeEvent(input$search_btn, {
# dt2_proxy_search(proxy, input$search_text)
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_fillable(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# padding = "1rem",
# card(
# card_header("Styled Buttons"),
# card_body(dt2_output("tbl"))
# )
# )
#
# server <- function(input, output, session) {
# output$tbl <- render_dt2({
# opts <- dt2_use_buttons(
# buttons = c("copy", "csv", "excel", "print"),
# position = "topEnd",
# button_class = "btn btn-sm btn-primary"
# )
# dt2(mtcars, options = opts)
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_fillable(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# padding = "1rem",
# card(
# card_header("Scroller \u2014 10 000 rows"),
# card_body(dt2_output("tbl"))
# )
# )
#
# server <- function(input, output, session) {
# big <- data.frame(
# id = 1:10000,
# value = round(rnorm(10000), 3),
# group = sample(LETTERS[1:5], 10000, replace = TRUE)
# )
#
# output$tbl <- render_dt2({
# dt2(big, options = list(
# scroller = TRUE,
# scrollY = 400,
# deferRender = TRUE,
# buttons = list("copy", "csv"),
# layout = list(
# topStart = list(search = list(placeholder = "Filter...")),
# topEnd = "buttons"
# )
# ))
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_fillable(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# padding = "1rem",
# card(
# card_header("Custom Layout"),
# card_body(dt2_output("tbl"))
# )
# )
#
# server <- function(input, output, session) {
# output$tbl <- render_dt2({
# dt2(iris, options = list(
# pageLength = 10,
# layout = list(
# topStart = "pageLength",
# topEnd = list(
# buttons = list("copy", "csv", "excel"),
# search = list(placeholder = "Search...")
# ),
# bottomStart = "info",
# bottomEnd = "paging"
# )
# ))
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_fillable(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# padding = "1rem",
# layout_columns(
# col_widths = c(6, 6),
# card(
# card_header("Simple (prev / next only)"),
# card_body(dt2_output("tbl_simple"))
# ),
# card(
# card_header("Full (first / 1 2 3 / last)"),
# card_body(dt2_output("tbl_full"))
# )
# ),
# card(
# card_header("No pagination"),
# card_body(dt2_output("tbl_none"))
# )
# )
#
# server <- function(input, output, session) {
# output$tbl_simple <- render_dt2({
# dt2(iris, options = list(
# pageLength = 5,
# layout = list(bottomEnd = list(paging = list(
# type = "simple"
# )))
# ))
# })
# output$tbl_full <- render_dt2({
# dt2(iris, options = list(
# pageLength = 5,
# layout = list(bottomEnd = list(paging = list(
# firstLast = TRUE, previousNext = TRUE, numbers = TRUE
# )))
# ))
# })
# output$tbl_none <- render_dt2({
# dt2(iris[1:15, ], options = list(paging = FALSE))
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_fillable(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# padding = "1rem",
# card(
# card_header("Inline Inputs"),
# card_body(dt2_output("tbl"))
# ),
# card(
# card_header("Events"),
# card_body(verbatimTextOutput("events"))
# )
# )
#
# server <- function(input, output, session) {
# df <- data.frame(
# name = c("Alice", "Bob", "Carol", "Dave"),
# score = c(95, 82, 91, 78),
# select = NA,
# action = NA
# )
#
# output$tbl <- render_dt2({
# opts <- list(columns = names(df), pageLength = 10)
# opts <- dt2_col_checkbox(opts, "select")
# opts <- dt2_col_button(opts, "action", label = "View")
# dt2(df, options = opts)
# })
#
# event_log <- reactiveVal("")
#
# observeEvent(input$tbl_row_check, {
# info <- input$tbl_row_check
# msg <- paste0("Checkbox row ", info$row, ": ", info$value, "\n")
# event_log(paste0(event_log(), msg))
# })
#
# observeEvent(input$tbl_row_button, {
# info <- input$tbl_row_button
# msg <- paste0("Button clicked row ", info$row, "\n")
# event_log(paste0(event_log(), msg))
# })
#
# output$events <- renderText(event_log())
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_fillable(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# padding = "1rem",
# card(
# card_header("Server-Side Processing \u2014 100k rows"),
# card_body(dt2_output("tbl"))
# )
# )
#
# server <- function(input, output, session) {
# large_data <- data.frame(
# id = seq_len(100000),
# value = round(rnorm(100000), 4),
# group = sample(LETTERS[1:5], 100000, replace = TRUE)
# )
#
# dt2_bind_server("tbl", large_data)
#
# output$tbl <- render_dt2({
# dt2(large_data, options = list(
# columns = names(large_data),
# pageLength = 25,
# server_side = TRUE,
# language = list(info = "Showing _START_ to _END_ of _TOTAL_ rows")
# ))
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# ui <- page_sidebar(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# title = "DT2 + bslib",
# sidebar = sidebar(
# selectInput("dataset", "Dataset",
# c("iris", "mtcars", "airquality")),
# selectInput("theme_preset", "Theme preset",
# c("default", "clean", "minimal", "compact"))
# ),
# card(
# card_header("Table"),
# card_body(dt2_output("tbl"))
# )
# )
#
# server <- function(input, output, session) {
# output$tbl <- render_dt2({
# data <- switch(input$dataset,
# iris = iris,
# mtcars = mtcars,
# airquality = airquality
# )
# dt2(data,
# theme = input$theme_preset,
# options = list(pageLength = 10))
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
#
# my_theme <- dt2_theme("clean",
# compact = TRUE,
# font_scale = 0.85,
# button_class = "btn btn-sm btn-outline-dark"
# )
#
# ui <- page_fillable(
# theme = bs_theme(version = 5, bootswatch = "flatly"),
# padding = "1rem",
# layout_columns(
# col_widths = c(6, 6),
# card(
# card_header("iris"),
# card_body(dt2_output("tbl1"))
# ),
# card(
# card_header("mtcars"),
# card_body(dt2_output("tbl2"))
# )
# )
# )
#
# server <- function(input, output, session) {
# output$tbl1 <- render_dt2({
# dt2(iris, theme = my_theme, options = dt2_use_buttons(
# buttons = c("copy", "csv")
# ))
# })
#
# output$tbl2 <- render_dt2({
# dt2(mtcars, theme = my_theme, options = list(pageLength = 15))
# })
# }
#
# shinyApp(ui, server)
## -----------------------------------------------------------------------------
# library(jsonlite)
# library(dplyr)
# library(tibble)
# library(lubridate)
#
# # ── Sample data (57 employees) ────────────────────────────────────────────────
# json_url <- "https://raw.githubusercontent.com/StrategicProjects/DT2/main/inst/examples/employees.json"
# # For offline use, the same JSON is bundled in inst/examples/employees.json
#
# json_txt <- '{
# "data": [
# {"name":"Tiger Nixon","position":"System Architect","salary":"320800","start_date":"2011-04-25","office":"Edinburgh","extn":"5421"},
# {"name":"Garrett Winters","position":"Accountant","salary":"170750","start_date":"2011-07-25","office":"Tokyo","extn":"8422"},
# {"name":"Ashton Cox","position":"Junior Technical Author","salary":"86000","start_date":"2009-01-12","office":"San Francisco","extn":"1562"},
# {"name":"Cedric Kelly","position":"Senior JavaScript Developer","salary":"433060","start_date":"2012-03-29","office":"Edinburgh","extn":"6224"},
# {"name":"Airi Satou","position":"Accountant","salary":"162700","start_date":"2008-11-28","office":"Tokyo","extn":"5407"},
# {"name":"Brielle Williamson","position":"Integration Specialist","salary":"372000","start_date":"2012-12-02","office":"New York","extn":"4804"},
# {"name":"Herrod Chandler","position":"Sales Assistant","salary":"137500","start_date":"2012-08-06","office":"San Francisco","extn":"9608"},
# {"name":"Rhona Davidson","position":"Integration Specialist","salary":"327900","start_date":"2010-10-14","office":"Tokyo","extn":"6200"},
# {"name":"Colleen Hurst","position":"JavaScript Developer","salary":"205500","start_date":"2009-09-15","office":"San Francisco","extn":"2360"},
# {"name":"Sonya Frost","position":"Software Engineer","salary":"103600","start_date":"2008-12-13","office":"Edinburgh","extn":"1667"}
# ]
# }'
#
# df <- fromJSON(json_txt, flatten = TRUE)$data %>%
# as_tibble() %>%
# mutate(
# salary = as.numeric(salary),
# extn = as.integer(extn),
# start_date = ymd(start_date)
# )
#
# # ── Shiny App ─────────────────────────────────────────────────────────────────
# library(shiny)
# library(bslib)
# library(DT2)
# library(htmlwidgets)
#
# ui <- page_sidebar(
# theme = bs_theme(version = 5, bootswatch = "spacelab"),
# title = "DT2 — Complete Example",
# sidebar = sidebar(
# h5("Features"),
# tags$ul(
# tags$li("ColumnControl (order + search dropdowns)"),
# tags$li("Export buttons with spacer"),
# tags$li("Custom JS renderers"),
# tags$li("pt-BR translation")
# )
# ),
# # Flag sprites
# tags$head(
# tags$link(
# rel = "stylesheet", type = "text/css",
# href = "https://cdn.jsdelivr.net/gh/lafeber/world-flags-sprite/stylesheets/flags32-both.css"
# ),
# tags$style(HTML("
# .f32 .flag { display:inline-block; width:32px; height:32px;
# vertical-align:middle; margin-right:6px; }
# table.dataTable tbody td { vertical-align: middle; }
# "))
# ),
# card(
# card_header("Employee Table"),
# card_body(dt2_output("tbl", height = "auto"))
# )
# )
#
# server <- function(input, output, session) {
# output$tbl <- render_dt2({
#
# # ── JS Renderers ──────────────────────────────────────────
# office_js <- JS("
# function(data, type) {
# if (type !== 'display') return data;
# var cc = {Argentina:'ar', Edinburgh:'_Scotland', London:'_England',
# 'New York':'us', 'San Francisco':'us', Sydney:'au', Tokyo:'jp'};
# var flag = cc[data] || '';
# return ' ' + data;
# }
# ")
#
# salary_js <- JS("
# (function() {
# var nfmt = DataTable.render.number('.', ',', 2, 'R$ ');
# return function(data, type) {
# var txt = nfmt.display(data);
# if (type !== 'display') return txt;
# var c = data < 250000 ? 'red' : data < 500000 ? 'orange' : 'green';
# return '' + txt + '';
# };
# })()
# ")
#
# extn_js <- JS("
# function(data, type) {
# return type === 'display'
# ? ''
# : data;
# }
# ")
#
# # ── Options ───────────────────────────────────────────────
# opts <- list(
# pageLength = 10,
# lengthMenu = c(10, 25, -1),
# columns = names(df),
#
# layout = list(
# topStart = "pageLength",
# topEnd = list(
# buttons = list(
# list(extend = "copyHtml5", text = "Copiar"),
# list(extend = "csvHtml5"),
# list(extend = "excelHtml5"),
# list(extend = "spacer", style = "bar"),
# list(extend = "colvis", text = "Colunas")
# ),
# search = list(placeholder = "")
# ),
# bottomEnd = "paging"
# ),
#
# columnControl = list(
# target = 0,
# content = list("order", "searchDropdown", list(
# list(extend = "orderAsc", text = "Ordem crescente"),
# list(extend = "orderDesc", text = "Ordem decrescente"),
# "spacer",
# list(extend = "colVisDropdown", text = "Selecionar colunas")
# ))
# ),
# ordering = list(indicators = FALSE, handler = FALSE),
#
# columnDefs = list(
# list(targets = which(names(df) == "office") - 1L,
# className = "f32", render = office_js),
# list(targets = which(names(df) == "salary") - 1L,
# className = "dt-body-right", render = salary_js),
# list(targets = which(names(df) == "extn") - 1L,
# render = extn_js)
# ),
#
# language = list(
# lengthMenu = "Mostrar _MENU_",
# search = "Buscar",
# info = "Mostrando _START_ a _END_ de _TOTAL_ registros",
# infoEmpty = "Nenhum registro",
# zeroRecords = "Nenhum registro encontrado",
# emptyTable = "Nenhum dado disponível",
# decimal = ",", thousands = ".", infoThousands = ".",
# lengthLabels = list(`10` = "10", `25` = "25", `-1` = "Todas"),
# paginate = list(first="«", previous="‹", `next`="›", last="»"),
# buttons = list(
# copyTitle = "Copiado!",
# copySuccess = list(`_` = "%d linhas copiadas", `1` = "1 linha copiada")
# ),
# columnControl = list(
# orderAsc = "Crescente", orderDesc = "Decrescente",
# searchDropdown = "Pesquisar", colVisDropdown = "Colunas",
# searchClear = "Limpar",
# search = list(
# text = list(contains="Contém", starts="Começa por",
# ends="Termina em", equal="Igual a"),
# number = list(greater="Maior que", less="Menor que",
# equal="Igual a")
# )
# )
# )
# )
#
# dt2(df,
# compact = TRUE, striped = TRUE, hover = TRUE,
# font_scale = 0.85, responsive = FALSE,
# options = opts)
# })
# }
#
# shinyApp(ui, server)