diff --git a/DESCRIPTION b/DESCRIPTION index 1c3b44e8..bb7e367e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -112,6 +112,7 @@ Collate: 'launch_FreesearchR.R' 'missings-module.R' 'plot-download-module.R' + 'plot_bar.R' 'plot_box.R' 'plot_euler.R' 'plot_hbar.R' diff --git a/NAMESPACE b/NAMESPACE index 1544994a..127b112c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -100,12 +100,14 @@ export(missings_apex_plot) export(missings_validate) export(modal_create_column) export(modal_cut_variable) +export(modal_string_split) export(modal_update_factor) export(modal_visual_summary) export(modify_qmd) export(names2val) export(overview_vars) export(pipe_string) +export(plot_bar_single) export(plot_box) export(plot_box_single) export(plot_euler) @@ -137,6 +139,8 @@ export(show_data) export(simple_snake) export(sort_by) export(specify_qmd_format) +export(string_split_server) +export(string_split_ui) export(subset_types) export(supported_functions) export(supported_plots) diff --git a/NEWS.md b/NEWS.md index 5658b0c6..1345a963 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,10 @@ # FreesearchR 25.10.5 -*NEW* New character/text split function available. A selection of delimiters are recognised and selectable. Function only available if splittable variables are present. This was the last big function to implement after workshops at Jitimai in Zanzibar. +*NEW* New character/text split function available. A selection of delimiters are recognised and selectable. Function only available if splittable variables are present. + +*NEW* Distribution plotting for factors have been much improved including two new bar plot styles and removing options better suited for continuous data. + +These were the last major functions to be implemented after workshops at Jitimai in Zanzibar City, Zanzibar during October 2025. # FreesearchR 25.10.4 diff --git a/R/hosted_version.R b/R/hosted_version.R index b917069a..125f33e1 100644 --- a/R/hosted_version.R +++ b/R/hosted_version.R @@ -1 +1 @@ -hosted_version <- function()'v25.10.5-251030' +hosted_version <- function()'v25.10.5-251031' diff --git a/R/separate_string.R b/R/separate_string.R index 38a243bb..0aa64e6c 100644 --- a/R/separate_string.R +++ b/R/separate_string.R @@ -1,3 +1,12 @@ +#' String split module based on tidyr::separate_ +#' +#' @param id id +#' +#' @returns A shiny ui module +#' @export +#' +#' @name split-string +#' string_split_ui <- function(id) { ns <- NS(id) tagList( @@ -26,17 +35,17 @@ string_split_ui <- function(id) { ), shiny::fluidRow( column( - width = 3, + width = 4, shiny::h4(i18n$t("Original data")), - shiny::tableOutput(outputId = ns("orig_data")) + toastui::datagridOutput2(outputId = ns("orig_data")) + # DT::DTOutput(outputId = ns("orig_data_3")) # This doesn't render... # toastui::datagridOutput2(outputId = ns("orig_data_2")) ), - column(width = 1), column( width = 8, shiny::h4(i18n$t("Preview of result")), - shiny::tableOutput(outputId = ns("new_data")) + toastui::datagridOutput2(outputId = ns("new_data")) ) ), actionButton( @@ -50,11 +59,18 @@ string_split_ui <- function(id) { +#' @param data_r reactive data +#' +#' @returns shiny module server +#' @export +#' +#' @name split-string +#' string_split_server <- function(id, data_r = reactive(NULL)) { moduleServer( id, function(input, output, session) { - rv <- reactiveValues(data = NULL, temp = NULL, out=NULL) + rv <- reactiveValues(data = NULL, target=NULL, temp = NULL, out=NULL) ns <- session$ns @@ -80,6 +96,8 @@ string_split_server <- function(id, data_r = reactive(NULL)) { }, logical(1)) vars_num <- names(vars_num)[vars_num] + req(length(vars_num)>0) + output$variable <- shiny::renderUI( columnSelectInput( inputId = ns("variable"), @@ -103,6 +121,7 @@ string_split_server <- function(id, data_r = reactive(NULL)) { req(input$variable) # browser() + req(input$variable %in% names(rv$data)) # req({ # any(apply(data_r(),2,is_splittable)) # }) @@ -180,36 +199,46 @@ string_split_server <- function(id, data_r = reactive(NULL)) { ## Toastui would not render the original data, so the solution was to go ## with native table rendering, which works, but doesn't please the eye - output$orig_data <- shiny::renderTable({ - req(data_r()) - req(input$variable) - data <- data_r() |> - dplyr::select(tidyselect::all_of(input$variable)) - # browser() - head(data, 10) - }) - - # output$orig_data_2 <- toastui::renderDatagrid2({ + # output$orig_data <- shiny::renderTable({ # req(data_r()) # req(input$variable) # data <- data_r() |> # dplyr::select(tidyselect::all_of(input$variable)) # # browser() - # toastui::datagrid(head(data, 10)) + # head(data, 10) # }) + output$orig_data <- toastui::renderDatagrid2({ + req(data_r()) + req(input$variable) + req(hasName(rv$data, input$variable)) - output$new_data <- shiny::renderTable({ + data <- data_r() |> + dplyr::select(tidyselect::all_of(input$variable)) |> + head(30) |> + dplyr::mutate(row=dplyr::row_number()) |> + dplyr::select(row,tidyselect::everything()) + # browser() + toastui::datagrid( + data = data, + rowHeight = 40, + colwidths = "guess", + theme = "default", + bodyHeight = "auto", + pagination = 10) + }) + + output$new_data <- toastui::renderDatagrid2({ shiny::req(rv$temp) data <- rv$temp - head(data, 10) - # toastui::datagrid( - # data = head(data, 100), - # colwidths = "guess", - # theme = "default", - # bodyHeight = "auto", pagination = 10 - # ) + toastui::datagrid( + data = head(data, 30), + rowHeight = 40, + colwidths = "guess", + theme = "default", + bodyHeight = "auto", pagination = 10 + ) }) data_split_r <- reactive({ @@ -256,6 +285,15 @@ string_split_server <- function(id, data_r = reactive(NULL)) { } +#' @param title Modal title +#' @param easyClose easyClose +#' @param size size +#' @param footer footer +#' +#' @returns shiny modal +#' @export +#' +#' @name split-string modal_string_split <- function(id, title = i18n$t("Split character string"), easyClose = TRUE, @@ -373,3 +411,40 @@ is_splittable <- function(data) { FALSE } } + +# mtcars |> simple_dt() +simple_dt <- function(data,...){ + headerCallbackRemoveHeaderFooter <- c( + "function(thead, data, start, end, display){", + " $('th', thead).css('display', 'none');", + "}" + ) + + DT::datatable( + data, + options = list( + dom = "t", + ordering = FALSE, + paging = FALSE, + searching = FALSE, + # headerCallback = DT::JS(headerCallbackRemoveHeaderFooter), + columnDefs = list( + list( + targets = 1, + render = DT::JS( + "function(data, type, row, meta) {", + "return type === 'display' && data.length > 10 ?", + "'' + data.substr(0, 10) + '...' : data;", + "}"))) + ), + selection = 'none', + callback = DT::JS( + "$('table.dataTable.no-footer').css('border-bottom', 'none');" + ), + class = 'row-border', + escape = FALSE, + rownames = FALSE, + # width = 500, + filter = "none" + ) +} diff --git a/R/sysdata.rda b/R/sysdata.rda index 874a0e22..d6694eef 100644 Binary files a/R/sysdata.rda and b/R/sysdata.rda differ diff --git a/SESSION.md b/SESSION.md index 97445267..756f93cd 100644 --- a/SESSION.md +++ b/SESSION.md @@ -11,11 +11,11 @@ |collate |en_US.UTF-8 | |ctype |en_US.UTF-8 | |tz |Europe/Copenhagen | -|date |2025-10-30 | +|date |2025-10-31 | |rstudio |2025.05.0+496 Mariposa Orchid (desktop) | |pandoc |3.6.4 @ /opt/homebrew/bin/ (via rmarkdown) | |quarto |1.7.30 @ /usr/local/bin/quarto | -|FreesearchR |25.10.5.251030 | +|FreesearchR |25.10.5.251031 | -------------------------------------------------------------------------------- @@ -118,12 +118,15 @@ |KernSmooth |2.23-26 |2025-01-01 |CRAN (R 4.4.1) | |keyring |1.4.1 |2025-06-15 |CRAN (R 4.4.1) | |knitr |1.50 |2025-03-16 |CRAN (R 4.4.1) | +|labeling |0.4.3 |2023-08-29 |CRAN (R 4.4.1) | |later |1.4.2 |2025-04-08 |RSPM (R 4.4.0) | |lattice |0.22-7 |2025-04-02 |CRAN (R 4.4.1) | |lifecycle |1.0.4 |2023-11-07 |CRAN (R 4.4.1) | +|litedown |0.7 |2025-04-08 |CRAN (R 4.4.1) | |lme4 |1.1-37 |2025-03-26 |CRAN (R 4.4.1) | |lubridate |1.9.4 |2024-12-08 |CRAN (R 4.4.1) | |magrittr |2.0.3 |2022-03-30 |RSPM (R 4.4.0) | +|markdown |2.0 |2025-03-23 |CRAN (R 4.4.1) | |MASS |7.3-65 |2025-02-28 |CRAN (R 4.4.1) | |Matrix |1.7-3 |2025-03-11 |RSPM (R 4.4.0) | |memoise |2.0.1 |2021-11-26 |CRAN (R 4.4.0) | @@ -225,6 +228,7 @@ |uuid |1.2-1 |2024-07-29 |CRAN (R 4.4.1) | |V8 |6.0.6 |2025-08-18 |CRAN (R 4.4.1) | |vctrs |0.6.5 |2023-12-01 |CRAN (R 4.4.0) | +|viridisLite |0.4.2 |2023-05-02 |CRAN (R 4.4.1) | |vroom |1.6.5 |2023-12-05 |CRAN (R 4.4.0) | |withr |3.0.2 |2024-10-28 |CRAN (R 4.4.1) | |writexl |1.5.4 |2025-04-15 |CRAN (R 4.4.1) | diff --git a/man/compare_missings.Rd b/man/compare_missings.Rd index 8950200c..d7c412d0 100644 --- a/man/compare_missings.Rd +++ b/man/compare_missings.Rd @@ -4,7 +4,7 @@ \alias{compare_missings} \title{Pairwise comparison of missings across covariables} \usage{ -compare_missings(data, by_var) +compare_missings(data, by_var, max_level = 20) } \arguments{ \item{data}{data frame} diff --git a/man/split-string.Rd b/man/split-string.Rd new file mode 100644 index 00000000..7bf65a68 --- /dev/null +++ b/man/split-string.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/separate_string.R +\name{split-string} +\alias{split-string} +\alias{string_split_ui} +\alias{string_split_server} +\alias{modal_string_split} +\title{String split module based on tidyr::separate_} +\usage{ +string_split_ui(id) + +string_split_server(id, data_r = reactive(NULL)) + +modal_string_split( + id, + title = i18n$t("Split character string"), + easyClose = TRUE, + size = "xl", + footer = NULL +) +} +\arguments{ +\item{id}{id} + +\item{data_r}{reactive data} + +\item{title}{Modal title} + +\item{easyClose}{easyClose} + +\item{size}{size} + +\item{footer}{footer} +} +\value{ +A shiny ui module + +shiny module server + +shiny modal +} +\description{ +String split module based on tidyr::separate_ +}