Compare commits

..

4 commits

Author SHA1 Message Date
5c8d84fccd
JS in separate file to autohide dropdowns on navigation - new dev version
Some checks are pending
pkgdown.yaml / pkgdown (push) Waiting to run
2025-07-03 20:26:35 +02:00
7a76a83dba
first draft on missings 2025-07-03 16:20:29 +02:00
5c5f118f6e
new version 2025-07-03 16:20:15 +02:00
ec5603d368
new ui 2025-07-03 16:19:51 +02:00
25 changed files with 1625 additions and 1328 deletions

View file

@ -9,7 +9,7 @@ type: software
license: AGPL-3.0-or-later license: AGPL-3.0-or-later
title: 'FreesearchR: A free and open-source browser based data analysis tool for researchers title: 'FreesearchR: A free and open-source browser based data analysis tool for researchers
with publication ready output' with publication ready output'
version: 25.6.4 version: 25.7.2
doi: 10.5281/zenodo.14527429 doi: 10.5281/zenodo.14527429
identifiers: identifiers:
- type: url - type: url

View file

@ -1,6 +1,6 @@
Package: FreesearchR Package: FreesearchR
Title: A free and open-source browser based data analysis tool for researchers with publication ready output Title: A free and open-source browser based data analysis tool for researchers with publication ready output
Version: 25.6.4 Version: 25.7.2
Authors@R: c( Authors@R: c(
person("Andreas Gammelgaard", "Damsbo",email="agdamsbo@clin.au.dk", role = c("aut", "cre"), person("Andreas Gammelgaard", "Damsbo",email="agdamsbo@clin.au.dk", role = c("aut", "cre"),
comment = c(ORCID = "0000-0002-7559-1154")), comment = c(ORCID = "0000-0002-7559-1154")),

View file

@ -17,6 +17,7 @@ export(clean_common_axis)
export(clean_date) export(clean_date)
export(clean_sep) export(clean_sep)
export(columnSelectInput) export(columnSelectInput)
export(compare_missings)
export(contrast_text) export(contrast_text)
export(create_baseline) export(create_baseline)
export(create_column_server) export(create_column_server)

View file

@ -1,3 +1,11 @@
# FreesearchR 25.7.2 - DEV
- *FIX* refining hiding drop downs. All JavaScript is now in separate file. Coded with GAI help from claude.ai.
# FreesearchR 25.7.1
- *NEW* UI overhaul and navigation update. The interface is simplified to clearly show the relationship between panels and sub-items by abandoning multiple levels on panel to instead show a drop-down menu. This also results in simplified sidebar menus with room to add more controls in the future.
# FreesearchR 25.6.4 # FreesearchR 25.6.4
The app is now also published as a docker container. See the README for instructions. It is mainly to use for hosting the app. Work is ongoing to publish a true standalone app, preferably for both Windows and MacOS. The app is now also published as a docker container. See the README for instructions. It is mainly to use for hosting the app. Work is ongoing to publish a true standalone app, preferably for both Windows and MacOS.

View file

@ -1 +1 @@
app_version <- function()'25.6.4' app_version <- function()'25.7.2'

View file

@ -11,97 +11,96 @@
data_visuals_ui <- function(id, tab_title = "Plots", ...) { data_visuals_ui <- function(id, tab_title = "Plots", ...) {
ns <- shiny::NS(id) ns <- shiny::NS(id)
# bslib::navset_bar(
list( list(
bslib::layout_sidebar(
# Sidebar with a slider input sidebar = bslib::sidebar(
sidebar = bslib::sidebar( bslib::accordion(
bslib::accordion( multiple = FALSE,
multiple = FALSE, bslib::accordion_panel(
bslib::accordion_panel( title = "Creating plot",
title = "Creating plot", icon = bsicons::bs_icon("graph-up"),
icon = bsicons::bs_icon("graph-up"), shiny::uiOutput(outputId = ns("primary")),
shiny::uiOutput(outputId = ns("primary")), shiny::helpText('Only non-text variables are available for plotting. Go the "Data" to reclass data to plot.'),
shiny::helpText('Only non-text variables are available for plotting. Go the "Data" to reclass data to plot.'), shiny::tags$br(),
shiny::tags$br(), shiny::uiOutput(outputId = ns("type")),
shiny::uiOutput(outputId = ns("type")), shiny::uiOutput(outputId = ns("secondary")),
shiny::uiOutput(outputId = ns("secondary")), shiny::uiOutput(outputId = ns("tertiary")),
shiny::uiOutput(outputId = ns("tertiary")), shiny::br(),
shiny::br(), shiny::actionButton(
shiny::actionButton( inputId = ns("act_plot"),
inputId = ns("act_plot"), label = "Plot",
label = "Plot", width = "100%",
width = "100%", icon = shiny::icon("palette"),
icon = shiny::icon("palette"), disabled = FALSE
disabled = FALSE ),
shiny::helpText('Adjust settings, then press "Plot".')
), ),
shiny::helpText('Adjust settings, then press "Plot".') bslib::accordion_panel(
), title = "Download",
# bslib::accordion_panel( icon = bsicons::bs_icon("download"),
# title = "Advanced", shinyWidgets::noUiSliderInput(
# icon = bsicons::bs_icon("gear") inputId = ns("height_slide"),
# ), label = "Plot height (mm)",
bslib::accordion_panel( min = 50,
title = "Download", max = 300,
icon = bsicons::bs_icon("download"), value = 100,
shinyWidgets::noUiSliderInput( step = 1,
inputId = ns("height_slide"), format = shinyWidgets::wNumbFormat(decimals = 0),
label = "Plot height (mm)", color = datamods:::get_primary_color(),
min = 50, inline = TRUE
max = 300, ),
value = 100, # shiny::numericInput(
step = 1, # inputId = ns("height_numeric"),
format = shinyWidgets::wNumbFormat(decimals = 0), # label = "Plot height (mm)",
color = datamods:::get_primary_color(), # min = 50,
inline = TRUE # max = 300,
), # value = 100
# shiny::numericInput( # ),
# inputId = ns("height_numeric"), shinyWidgets::noUiSliderInput(
# label = "Plot height (mm)", inputId = ns("width"),
# min = 50, label = "Plot width (mm)",
# max = 300, min = 50,
# value = 100 max = 300,
# ), value = 100,
shinyWidgets::noUiSliderInput( step = 1,
inputId = ns("width"), format = shinyWidgets::wNumbFormat(decimals = 0),
label = "Plot width (mm)", color = datamods:::get_primary_color()
min = 50, ),
max = 300, shiny::selectInput(
value = 100, inputId = ns("plot_type"),
step = 1, label = "File format",
format = shinyWidgets::wNumbFormat(decimals = 0), choices = list(
color = datamods:::get_primary_color() "png",
), "tiff",
shiny::selectInput( "eps",
inputId = ns("plot_type"), "pdf",
label = "File format", "jpeg",
choices = list( "svg"
"png", )
"tiff", ),
"eps", shiny::br(),
"pdf", # Button
"jpeg", shiny::downloadButton(
"svg" outputId = ns("download_plot"),
label = "Download plot",
icon = shiny::icon("download")
) )
),
shiny::br(),
# Button
shiny::downloadButton(
outputId = ns("download_plot"),
label = "Download plot",
icon = shiny::icon("download")
) )
) ),
) shiny::p("We have collected a few notes on visualising data and details on the options included in FreesearchR:", shiny::tags$a(
), href = "https://agdamsbo.github.io/FreesearchR/articles/visuals.html",
bslib::nav_panel( "View notes in new tab",
title = tab_title, target = "_blank",
rel = "noopener noreferrer"
))
),
shiny::plotOutput(ns("plot"), height = "70vh"), shiny::plotOutput(ns("plot"), height = "70vh"),
shiny::tags$br(), shiny::tags$br(),
shiny::tags$br(), shiny::tags$br(),
shiny::htmlOutput(outputId = ns("code_plot")) shiny::htmlOutput(outputId = ns("code_plot"))
) )
) )
# )
} }
@ -725,6 +724,7 @@ get_label <- function(data, var = NULL) {
#' paste(sample(letters[1:10], 100, TRUE), collapse = "") |> line_break(force = TRUE) #' paste(sample(letters[1:10], 100, TRUE), collapse = "") |> line_break(force = TRUE)
line_break <- function(data, lineLength = 20, force = FALSE) { line_break <- function(data, lineLength = 20, force = FALSE) {
if (isTRUE(force)) { if (isTRUE(force)) {
## This eats some letters when splitting a sentence... ??
gsub(paste0("(.{1,", lineLength, "})(\\s|[[:alnum:]])"), "\\1\n", data) gsub(paste0("(.{1,", lineLength, "})(\\s|[[:alnum:]])"), "\\1\n", data)
} else { } else {
paste(strwrap(data, lineLength), collapse = "\n") paste(strwrap(data, lineLength), collapse = "\n")
@ -746,7 +746,7 @@ line_break <- function(data, lineLength = 20, force = FALSE) {
wrap_plot_list <- function(data, wrap_plot_list <- function(data,
tag_levels = NULL, tag_levels = NULL,
title = NULL, title = NULL,
axis.font.family=NULL, axis.font.family = NULL,
...) { ...) {
if (ggplot2::is_ggplot(data[[1]])) { if (ggplot2::is_ggplot(data[[1]])) {
if (length(data) > 1) { if (length(data) > 1) {

View file

@ -1 +1 @@
hosted_version <- function()'v25.6.4-250627' hosted_version <- function()'v25.7.2-250703'

View file

@ -44,14 +44,7 @@ data_missings_server <- function(id,
tryCatch( tryCatch(
{ {
if (!is.null(by_var) && by_var != "" && by_var %in% names(df_tbl)) { out <- compare_missings(df_tbl,by_var)
df_tbl[[by_var]] <- ifelse(is.na(df_tbl[[by_var]]), "Missing", "Non-missing")
out <- gtsummary::tbl_summary(df_tbl, by = by_var) |>
gtsummary::add_p()
} else {
out <- gtsummary::tbl_summary(df_tbl)
}
}, },
error = function(err) { error = function(err) {
showNotification(paste0("Error: ", err), type = "err") showNotification(paste0("Error: ", err), type = "err")
@ -129,10 +122,22 @@ missing_demo_app <- function() {
missing_demo_app() missing_demo_app()
#' Pairwise comparison of missings across covariables
#'
#' @param data data frame
#' @param by_var variable to stratify by missingness
#'
#' @returns gtsummary list object
#' @export
#'
compare_missings <- function(data,by_var){
if (!is.null(by_var) && by_var != "" && by_var %in% names(data)) {
data[[by_var]] <- ifelse(is.na(data[[by_var]]), "Missing", "Non-missing")
out <- gtsummary::tbl_summary(data, by = by_var) |>
gtsummary::add_p()
} else {
out <- gtsummary::tbl_summary(data)
}
out
}

View file

@ -44,155 +44,173 @@ regression_ui <- function(id, ...) {
ns <- shiny::NS(id) ns <- shiny::NS(id)
shiny::tagList( shiny::tagList(
title = "", # title = "",
sidebar = bslib::sidebar( bslib::nav_panel(
shiny::uiOutput(outputId = ns("data_info"), inline = TRUE), title = "Regression table",
bslib::accordion( bslib::layout_sidebar(
open = "acc_reg", sidebar = bslib::sidebar(
multiple = FALSE, shiny::uiOutput(outputId = ns("data_info"), inline = TRUE),
bslib::accordion_panel( bslib::accordion(
value = "acc_reg", open = "acc_reg",
title = "Regression", multiple = FALSE,
icon = bsicons::bs_icon("calculator"), bslib::accordion_panel(
shiny::uiOutput(outputId = ns("outcome_var")), value = "acc_reg",
# shiny::selectInput( title = "Regression",
# inputId = "design", icon = bsicons::bs_icon("calculator"),
# label = "Study design", shiny::uiOutput(outputId = ns("outcome_var")),
# selected = "no", # shiny::selectInput(
# inline = TRUE, # inputId = "design",
# choices = list( # label = "Study design",
# "Cross-sectional" = "cross-sectional" # selected = "no",
# ) # inline = TRUE,
# ), # choices = list(
shiny::uiOutput(outputId = ns("regression_type")), # "Cross-sectional" = "cross-sectional"
shiny::radioButtons( # )
inputId = ns("all"), # ),
label = "Specify covariables", shiny::uiOutput(outputId = ns("regression_type")),
inline = TRUE, selected = 2, shiny::radioButtons(
choiceNames = c( inputId = ns("all"),
"Yes", label = "Specify covariables",
"No" inline = TRUE, selected = 2,
), choiceNames = c(
choiceValues = c(1, 2) "Yes",
), "No"
shiny::conditionalPanel( ),
condition = "input.all==1", choiceValues = c(1, 2)
shiny::uiOutput(outputId = ns("regression_vars")), ),
shiny::helpText("If none are selected, all are included."), shiny::conditionalPanel(
shiny::tags$br(), condition = "input.all==1",
ns = ns shiny::uiOutput(outputId = ns("regression_vars")),
), shiny::helpText("If none are selected, all are included."),
bslib::input_task_button( shiny::tags$br(),
id = ns("load"), ns = ns
label = "Analyse", ),
icon = bsicons::bs_icon("pencil"), bslib::input_task_button(
label_busy = "Working...", id = ns("load"),
icon_busy = fontawesome::fa_i("arrows-rotate", label = "Analyse",
class = "fa-spin", icon = bsicons::bs_icon("pencil"),
"aria-hidden" = "true" label_busy = "Working...",
), icon_busy = fontawesome::fa_i("arrows-rotate",
type = "secondary", class = "fa-spin",
auto_reset = TRUE "aria-hidden" = "true"
), ),
shiny::helpText("Press 'Analyse' to create the regression model and after changing parameters."), type = "secondary",
shiny::tags$br(), auto_reset = TRUE
shiny::radioButtons( ),
inputId = ns("add_regression_p"), shiny::helpText("Press 'Analyse' to create the regression model and after changing parameters."),
label = "Show p-value",
inline = TRUE,
selected = "yes",
choices = list(
"Yes" = "yes",
"No" = "no"
)
),
# shiny::tags$br(),
# shiny::radioButtons(
# inputId = ns("tbl_theme"),
# label = "Show p-value",
# inline = TRUE,
# selected = "jama",
# choices = list(
# "JAMA" = "jama",
# "Lancet" = "lancet",
# "NEJM" = "nejm"
# )
# ),
shiny::tags$br()
),
do.call(
bslib::accordion_panel,
c(
list(
value = "acc_plot",
title = "Coefficient plot",
icon = bsicons::bs_icon("bar-chart-steps"),
shiny::tags$br(), shiny::tags$br(),
shiny::uiOutput(outputId = ns("plot_model")) shiny::radioButtons(
), inputId = ns("add_regression_p"),
# plot_download_ui(ns("reg_plot_download")) label = "Show p-value",
shiny::tagList( inline = TRUE,
shinyWidgets::noUiSliderInput( selected = "yes",
inputId = ns("plot_height"),
label = "Plot height (mm)",
min = 50,
max = 300,
value = 100,
step = 1,
format = shinyWidgets::wNumbFormat(decimals = 0),
color = datamods:::get_primary_color()
),
shinyWidgets::noUiSliderInput(
inputId = ns("plot_width"),
label = "Plot width (mm)",
min = 50,
max = 300,
value = 100,
step = 1,
format = shinyWidgets::wNumbFormat(decimals = 0),
color = datamods:::get_primary_color()
),
shiny::selectInput(
inputId = ns("plot_type"),
label = "File format",
choices = list( choices = list(
"png", "Yes" = "yes",
"tiff", "No" = "no"
"eps",
"pdf",
"jpeg",
"svg"
) )
), ),
shiny::br(), # shiny::tags$br(),
# Button # shiny::radioButtons(
shiny::downloadButton( # inputId = ns("tbl_theme"),
outputId = ns("download_plot"), # label = "Show p-value",
label = "Download plot", # inline = TRUE,
icon = shiny::icon("download") # selected = "jama",
# choices = list(
# "JAMA" = "jama",
# "Lancet" = "lancet",
# "NEJM" = "nejm"
# )
# ),
shiny::tags$br()
)
)
),
gt::gt_output(outputId = ns("table2"))
)
),
bslib::nav_panel(
title = "Coefficient plot",
bslib::layout_sidebar(
sidebar = bslib::sidebar(
bslib::accordion(
open = "acc_reg",
multiple = FALSE,
do.call(
bslib::accordion_panel,
c(
list(
value = "acc_plot",
title = "Coefficient plot",
icon = bsicons::bs_icon("bar-chart-steps"),
shiny::tags$br(),
shiny::uiOutput(outputId = ns("plot_model"))
),
# plot_download_ui(ns("reg_plot_download"))
shiny::tagList(
shinyWidgets::noUiSliderInput(
inputId = ns("plot_height"),
label = "Plot height (mm)",
min = 50,
max = 300,
value = 100,
step = 1,
format = shinyWidgets::wNumbFormat(decimals = 0),
color = datamods:::get_primary_color()
),
shinyWidgets::noUiSliderInput(
inputId = ns("plot_width"),
label = "Plot width (mm)",
min = 50,
max = 300,
value = 100,
step = 1,
format = shinyWidgets::wNumbFormat(decimals = 0),
color = datamods:::get_primary_color()
),
shiny::selectInput(
inputId = ns("plot_type"),
label = "File format",
choices = list(
"png",
"tiff",
"eps",
"pdf",
"jpeg",
"svg"
)
),
shiny::br(),
# Button
shiny::downloadButton(
outputId = ns("download_plot"),
label = "Download plot",
icon = shiny::icon("download")
)
)
) )
) )
) )
), ),
bslib::accordion_panel( shiny::plotOutput(outputId = ns("regression_plot"), height = "80vh")
value = "acc_checks",
title = "Checks",
icon = bsicons::bs_icon("clipboard-check"),
shiny::uiOutput(outputId = ns("plot_checks"))
)
) )
), ),
bslib::nav_panel(
title = "Regression table",
gt::gt_output(outputId = ns("table2"))
),
bslib::nav_panel(
title = "Coefficient plot",
shiny::plotOutput(outputId = ns("regression_plot"), height = "80vh")
),
bslib::nav_panel( bslib::nav_panel(
title = "Model checks", title = "Model checks",
shiny::plotOutput(outputId = ns("check"), height = "90vh") bslib::layout_sidebar(
sidebar = bslib::sidebar(
bslib::accordion(
open = "acc_reg",
multiple = FALSE,
bslib::accordion_panel(
value = "acc_checks",
title = "Checks",
icon = bsicons::bs_icon("clipboard-check"),
shiny::uiOutput(outputId = ns("plot_checks"))
)
)
),
shiny::plotOutput(outputId = ns("check"), height = "90vh")
)
) )
) )
} }

Binary file not shown.

View file

@ -11,11 +11,11 @@
|collate |en_US.UTF-8 | |collate |en_US.UTF-8 |
|ctype |en_US.UTF-8 | |ctype |en_US.UTF-8 |
|tz |Europe/Copenhagen | |tz |Europe/Copenhagen |
|date |2025-06-27 | |date |2025-07-03 |
|rstudio |2025.05.0+496 Mariposa Orchid (desktop) | |rstudio |2025.05.0+496 Mariposa Orchid (desktop) |
|pandoc |3.6.4 @ /opt/homebrew/bin/ (via rmarkdown) | |pandoc |3.6.4 @ /opt/homebrew/bin/ (via rmarkdown) |
|quarto |1.7.30 @ /usr/local/bin/quarto | |quarto |1.7.30 @ /usr/local/bin/quarto |
|FreesearchR |25.6.4.250627 | |FreesearchR |25.7.2.250703 |
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -26,6 +26,8 @@
|apexcharter |0.4.4 |2024-09-06 |CRAN (R 4.4.1) | |apexcharter |0.4.4 |2024-09-06 |CRAN (R 4.4.1) |
|askpass |1.2.1 |2024-10-04 |CRAN (R 4.4.1) | |askpass |1.2.1 |2024-10-04 |CRAN (R 4.4.1) |
|assertthat |0.2.1 |2019-03-21 |CRAN (R 4.4.1) | |assertthat |0.2.1 |2019-03-21 |CRAN (R 4.4.1) |
|attachment |0.4.5 |2025-03-14 |CRAN (R 4.4.1) |
|attempt |0.3.1 |2020-05-03 |CRAN (R 4.4.1) |
|backports |1.5.0 |2024-05-23 |CRAN (R 4.4.1) | |backports |1.5.0 |2024-05-23 |CRAN (R 4.4.1) |
|base64enc |0.1-3 |2015-07-28 |CRAN (R 4.4.1) | |base64enc |0.1-3 |2015-07-28 |CRAN (R 4.4.1) |
|bayestestR |0.15.3 |2025-04-28 |CRAN (R 4.4.1) | |bayestestR |0.15.3 |2025-04-28 |CRAN (R 4.4.1) |
@ -43,6 +45,7 @@
|cardx |0.2.4 |2025-04-12 |CRAN (R 4.4.1) | |cardx |0.2.4 |2025-04-12 |CRAN (R 4.4.1) |
|caTools |1.18.3 |2024-09-04 |CRAN (R 4.4.1) | |caTools |1.18.3 |2024-09-04 |CRAN (R 4.4.1) |
|cellranger |1.1.0 |2016-07-27 |CRAN (R 4.4.0) | |cellranger |1.1.0 |2016-07-27 |CRAN (R 4.4.0) |
|cffr |1.2.0 |2025-01-25 |CRAN (R 4.4.1) |
|checkmate |2.3.2 |2024-07-29 |CRAN (R 4.4.0) | |checkmate |2.3.2 |2024-07-29 |CRAN (R 4.4.0) |
|class |7.3-23 |2025-01-01 |CRAN (R 4.4.1) | |class |7.3-23 |2025-01-01 |CRAN (R 4.4.1) |
|classInt |0.4-11 |2025-01-08 |CRAN (R 4.4.1) | |classInt |0.4-11 |2025-01-08 |CRAN (R 4.4.1) |
@ -52,6 +55,9 @@
|colorspace |2.1-1 |2024-07-26 |CRAN (R 4.4.1) | |colorspace |2.1-1 |2024-07-26 |CRAN (R 4.4.1) |
|commonmark |1.9.5 |2025-03-17 |CRAN (R 4.4.1) | |commonmark |1.9.5 |2025-03-17 |CRAN (R 4.4.1) |
|crayon |1.5.3 |2024-06-20 |CRAN (R 4.4.1) | |crayon |1.5.3 |2024-06-20 |CRAN (R 4.4.1) |
|credentials |2.0.2 |2024-10-04 |CRAN (R 4.4.1) |
|crosstalk |1.2.1 |2023-11-23 |CRAN (R 4.4.0) |
|curl |6.2.2 |2025-03-24 |CRAN (R 4.4.1) |
|data.table |1.17.0 |2025-02-22 |CRAN (R 4.4.1) | |data.table |1.17.0 |2025-02-22 |CRAN (R 4.4.1) |
|datamods |1.5.3 |2024-10-02 |CRAN (R 4.4.1) | |datamods |1.5.3 |2024-10-02 |CRAN (R 4.4.1) |
|datawizard |1.0.2 |2025-03-24 |CRAN (R 4.4.1) | |datawizard |1.0.2 |2025-03-24 |CRAN (R 4.4.1) |
@ -60,11 +66,13 @@
|devtools |2.4.5 |2022-10-11 |CRAN (R 4.4.0) | |devtools |2.4.5 |2022-10-11 |CRAN (R 4.4.0) |
|DHARMa |0.4.7 |2024-10-18 |CRAN (R 4.4.1) | |DHARMa |0.4.7 |2024-10-18 |CRAN (R 4.4.1) |
|digest |0.6.37 |2024-08-19 |CRAN (R 4.4.1) | |digest |0.6.37 |2024-08-19 |CRAN (R 4.4.1) |
|dockerfiler |0.2.5 |2025-05-07 |CRAN (R 4.4.1) |
|doParallel |1.0.17 |2022-02-07 |CRAN (R 4.4.0) | |doParallel |1.0.17 |2022-02-07 |CRAN (R 4.4.0) |
|dplyr |1.1.4 |2023-11-17 |CRAN (R 4.4.0) | |dplyr |1.1.4 |2023-11-17 |CRAN (R 4.4.0) |
|DT |0.33 |2024-04-04 |CRAN (R 4.4.0) | |DT |0.33 |2024-04-04 |CRAN (R 4.4.0) |
|e1071 |1.7-16 |2024-09-16 |CRAN (R 4.4.1) | |e1071 |1.7-16 |2024-09-16 |CRAN (R 4.4.1) |
|easystats |0.7.4 |2025-02-06 |CRAN (R 4.4.1) | |easystats |0.7.4 |2025-02-06 |CRAN (R 4.4.1) |
|effectsize |1.0.0 |2024-12-10 |CRAN (R 4.4.1) |
|ellipsis |0.3.2 |2021-04-29 |CRAN (R 4.4.1) | |ellipsis |0.3.2 |2021-04-29 |CRAN (R 4.4.1) |
|emmeans |1.11.1 |2025-05-04 |CRAN (R 4.4.1) | |emmeans |1.11.1 |2025-05-04 |CRAN (R 4.4.1) |
|esquisse |2.1.0 |2025-02-21 |CRAN (R 4.4.1) | |esquisse |2.1.0 |2025-02-21 |CRAN (R 4.4.1) |
@ -82,16 +90,19 @@
|foreach |1.5.2 |2022-02-02 |CRAN (R 4.4.0) | |foreach |1.5.2 |2022-02-02 |CRAN (R 4.4.0) |
|foreign |0.8-90 |2025-03-31 |CRAN (R 4.4.1) | |foreign |0.8-90 |2025-03-31 |CRAN (R 4.4.1) |
|Formula |1.2-5 |2023-02-24 |CRAN (R 4.4.1) | |Formula |1.2-5 |2023-02-24 |CRAN (R 4.4.1) |
|FreesearchR |25.6.4 |NA |NA | |FreesearchR |25.7.2 |NA |NA |
|fs |1.6.6 |2025-04-12 |CRAN (R 4.4.1) | |fs |1.6.6 |2025-04-12 |CRAN (R 4.4.1) |
|gdtools |0.4.2 |2025-03-27 |CRAN (R 4.4.1) | |gdtools |0.4.2 |2025-03-27 |CRAN (R 4.4.1) |
|generics |0.1.3 |2022-07-05 |CRAN (R 4.4.1) | |generics |0.1.3 |2022-07-05 |CRAN (R 4.4.1) |
|gert |2.1.5 |2025-03-25 |CRAN (R 4.4.1) |
|ggalluvial |0.12.5 |2023-02-22 |CRAN (R 4.4.0) | |ggalluvial |0.12.5 |2023-02-22 |CRAN (R 4.4.0) |
|ggcorrplot |0.1.4.1 |2023-09-05 |CRAN (R 4.4.0) | |ggcorrplot |0.1.4.1 |2023-09-05 |CRAN (R 4.4.0) |
|ggforce |0.4.2 |2024-02-19 |CRAN (R 4.4.0) | |ggforce |0.4.2 |2024-02-19 |CRAN (R 4.4.0) |
|ggplot2 |3.5.2 |2025-04-09 |CRAN (R 4.4.1) | |ggplot2 |3.5.2 |2025-04-09 |CRAN (R 4.4.1) |
|ggridges |0.5.6 |2024-01-23 |CRAN (R 4.4.0) | |ggridges |0.5.6 |2024-01-23 |CRAN (R 4.4.0) |
|ggstats |0.9.0 |2025-03-10 |CRAN (R 4.4.1) | |ggstats |0.9.0 |2025-03-10 |CRAN (R 4.4.1) |
|gh |1.4.1 |2024-03-28 |CRAN (R 4.4.0) |
|gitcreds |0.1.2 |2022-09-08 |CRAN (R 4.4.1) |
|glue |1.8.0 |2024-09-30 |CRAN (R 4.4.1) | |glue |1.8.0 |2024-09-30 |CRAN (R 4.4.1) |
|gridExtra |2.3 |2017-09-09 |CRAN (R 4.4.1) | |gridExtra |2.3 |2017-09-09 |CRAN (R 4.4.1) |
|gt |1.0.0 |2025-04-05 |CRAN (R 4.4.1) | |gt |1.0.0 |2025-04-05 |CRAN (R 4.4.1) |
@ -105,24 +116,30 @@
|htmltools |0.5.8.1 |2024-04-04 |CRAN (R 4.4.1) | |htmltools |0.5.8.1 |2024-04-04 |CRAN (R 4.4.1) |
|htmlwidgets |1.6.4 |2023-12-06 |CRAN (R 4.4.0) | |htmlwidgets |1.6.4 |2023-12-06 |CRAN (R 4.4.0) |
|httpuv |1.6.16 |2025-04-16 |CRAN (R 4.4.1) | |httpuv |1.6.16 |2025-04-16 |CRAN (R 4.4.1) |
|httr2 |1.1.2 |2025-03-26 |CRAN (R 4.4.1) |
|IDEAFilter |0.2.0 |2024-04-15 |CRAN (R 4.4.0) | |IDEAFilter |0.2.0 |2024-04-15 |CRAN (R 4.4.0) |
|insight |1.2.0 |2025-04-22 |CRAN (R 4.4.1) | |insight |1.2.0 |2025-04-22 |CRAN (R 4.4.1) |
|iterators |1.0.14 |2022-02-05 |CRAN (R 4.4.1) | |iterators |1.0.14 |2022-02-05 |CRAN (R 4.4.1) |
|jquerylib |0.1.4 |2021-04-26 |CRAN (R 4.4.0) | |jquerylib |0.1.4 |2021-04-26 |CRAN (R 4.4.0) |
|jsonlite |2.0.0 |2025-03-27 |CRAN (R 4.4.1) | |jsonlite |2.0.0 |2025-03-27 |CRAN (R 4.4.1) |
|jsonvalidate |1.5.0 |2025-02-07 |CRAN (R 4.4.1) |
|KernSmooth |2.23-26 |2025-01-01 |CRAN (R 4.4.1) | |KernSmooth |2.23-26 |2025-01-01 |CRAN (R 4.4.1) |
|keyring |1.3.2 |2023-12-11 |CRAN (R 4.4.0) | |keyring |1.3.2 |2023-12-11 |CRAN (R 4.4.0) |
|knitr |1.50 |2025-03-16 |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) | |labeling |0.4.3 |2023-08-29 |CRAN (R 4.4.1) |
|labelled |2.14.0 |2025-01-08 |CRAN (R 4.4.1) |
|later |1.4.2 |2025-04-08 |CRAN (R 4.4.1) | |later |1.4.2 |2025-04-08 |CRAN (R 4.4.1) |
|lattice |0.22-7 |2025-04-02 |CRAN (R 4.4.1) | |lattice |0.22-7 |2025-04-02 |CRAN (R 4.4.1) |
|lifecycle |1.0.4 |2023-11-07 |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) | |lme4 |1.1-37 |2025-03-26 |CRAN (R 4.4.1) |
|lubridate |1.9.4 |2024-12-08 |CRAN (R 4.4.1) | |lubridate |1.9.4 |2024-12-08 |CRAN (R 4.4.1) |
|magrittr |2.0.3 |2022-03-30 |CRAN (R 4.4.1) | |magrittr |2.0.3 |2022-03-30 |CRAN (R 4.4.1) |
|markdown |2.0 |2025-03-23 |CRAN (R 4.4.1) |
|MASS |7.3-65 |2025-02-28 |CRAN (R 4.4.1) | |MASS |7.3-65 |2025-02-28 |CRAN (R 4.4.1) |
|Matrix |1.7-3 |2025-03-11 |CRAN (R 4.4.1) | |Matrix |1.7-3 |2025-03-11 |CRAN (R 4.4.1) |
|memoise |2.0.1 |2021-11-26 |CRAN (R 4.4.0) | |memoise |2.0.1 |2021-11-26 |CRAN (R 4.4.0) |
|mgcv |1.9-3 |2025-04-04 |CRAN (R 4.4.1) |
|mime |0.13 |2025-03-17 |CRAN (R 4.4.1) | |mime |0.13 |2025-03-17 |CRAN (R 4.4.1) |
|miniUI |0.1.2 |2025-04-17 |CRAN (R 4.4.1) | |miniUI |0.1.2 |2025-04-17 |CRAN (R 4.4.1) |
|minqa |1.2.8 |2024-08-17 |CRAN (R 4.4.1) | |minqa |1.2.8 |2024-08-17 |CRAN (R 4.4.1) |
@ -134,6 +151,7 @@
|opdisDownsampling |1.0.1 |2024-04-15 |CRAN (R 4.4.0) | |opdisDownsampling |1.0.1 |2024-04-15 |CRAN (R 4.4.0) |
|openssl |2.3.2 |2025-02-03 |CRAN (R 4.4.1) | |openssl |2.3.2 |2025-02-03 |CRAN (R 4.4.1) |
|openxlsx2 |1.15 |2025-04-25 |CRAN (R 4.4.1) | |openxlsx2 |1.15 |2025-04-25 |CRAN (R 4.4.1) |
|pak |0.8.0.2 |2025-04-08 |CRAN (R 4.4.1) |
|parameters |0.24.2 |2025-03-04 |CRAN (R 4.4.1) | |parameters |0.24.2 |2025-03-04 |CRAN (R 4.4.1) |
|patchwork |1.3.0 |2024-09-16 |CRAN (R 4.4.1) | |patchwork |1.3.0 |2024-09-16 |CRAN (R 4.4.1) |
|pbmcapply |1.5.1 |2022-04-28 |CRAN (R 4.4.1) | |pbmcapply |1.5.1 |2022-04-28 |CRAN (R 4.4.1) |
@ -162,6 +180,7 @@
|R6 |2.6.1 |2025-02-15 |CRAN (R 4.4.1) | |R6 |2.6.1 |2025-02-15 |CRAN (R 4.4.1) |
|ragg |1.4.0 |2025-04-10 |CRAN (R 4.4.1) | |ragg |1.4.0 |2025-04-10 |CRAN (R 4.4.1) |
|rankinPlot |1.1.0 |2023-01-30 |CRAN (R 4.4.0) | |rankinPlot |1.1.0 |2023-01-30 |CRAN (R 4.4.0) |
|rappdirs |0.3.3 |2021-01-31 |CRAN (R 4.4.1) |
|rbibutils |2.3 |2024-10-04 |CRAN (R 4.4.1) | |rbibutils |2.3 |2024-10-04 |CRAN (R 4.4.1) |
|RColorBrewer |1.1-3 |2022-04-03 |CRAN (R 4.4.1) | |RColorBrewer |1.1-3 |2022-04-03 |CRAN (R 4.4.1) |
|Rcpp |1.0.14 |2025-01-12 |CRAN (R 4.4.1) | |Rcpp |1.0.14 |2025-01-12 |CRAN (R 4.4.1) |
@ -192,13 +211,16 @@
|see |0.11.0 |2025-03-11 |CRAN (R 4.4.1) | |see |0.11.0 |2025-03-11 |CRAN (R 4.4.1) |
|sessioninfo |1.2.3 |2025-02-05 |CRAN (R 4.4.1) | |sessioninfo |1.2.3 |2025-02-05 |CRAN (R 4.4.1) |
|shiny |1.10.0 |2024-12-14 |CRAN (R 4.4.1) | |shiny |1.10.0 |2024-12-14 |CRAN (R 4.4.1) |
|shiny2docker |0.0.2 |2025-02-09 |CRAN (R 4.4.1) |
|shinybusy |0.3.3 |2024-03-09 |CRAN (R 4.4.0) | |shinybusy |0.3.3 |2024-03-09 |CRAN (R 4.4.0) |
|shinyjs |2.1.0 |2021-12-23 |CRAN (R 4.4.0) | |shinyjs |2.1.0 |2021-12-23 |CRAN (R 4.4.0) |
|shinyTime |1.0.3 |2022-08-19 |CRAN (R 4.4.0) | |shinyTime |1.0.3 |2022-08-19 |CRAN (R 4.4.0) |
|shinyWidgets |0.9.0 |2025-02-21 |CRAN (R 4.4.1) | |shinyWidgets |0.9.0 |2025-02-21 |CRAN (R 4.4.1) |
|sourcetools |0.1.7-1 |2023-02-01 |CRAN (R 4.4.1) |
|stringi |1.8.7 |2025-03-27 |CRAN (R 4.4.1) | |stringi |1.8.7 |2025-03-27 |CRAN (R 4.4.1) |
|stringr |1.5.1 |2023-11-14 |CRAN (R 4.4.0) | |stringr |1.5.1 |2023-11-14 |CRAN (R 4.4.0) |
|styler |1.10.3 |2024-04-07 |CRAN (R 4.4.0) | |styler |1.10.3 |2024-04-07 |CRAN (R 4.4.0) |
|sys |3.4.3 |2024-10-04 |CRAN (R 4.4.1) |
|systemfonts |1.2.2 |2025-04-04 |CRAN (R 4.4.1) | |systemfonts |1.2.2 |2025-04-04 |CRAN (R 4.4.1) |
|testthat |3.2.3 |2025-01-13 |CRAN (R 4.4.1) | |testthat |3.2.3 |2025-01-13 |CRAN (R 4.4.1) |
|textshaping |1.0.0 |2025-01-20 |CRAN (R 4.4.1) | |textshaping |1.0.0 |2025-01-20 |CRAN (R 4.4.1) |
@ -213,11 +235,9 @@
|tzdb |0.5.0 |2025-03-15 |CRAN (R 4.4.1) | |tzdb |0.5.0 |2025-03-15 |CRAN (R 4.4.1) |
|urlchecker |1.0.1 |2021-11-30 |CRAN (R 4.4.1) | |urlchecker |1.0.1 |2021-11-30 |CRAN (R 4.4.1) |
|usethis |3.1.0 |2024-11-26 |CRAN (R 4.4.1) | |usethis |3.1.0 |2024-11-26 |CRAN (R 4.4.1) |
|utf8 |1.2.4 |2023-10-22 |CRAN (R 4.4.1) |
|uuid |1.2-1 |2024-07-29 |CRAN (R 4.4.1) | |uuid |1.2-1 |2024-07-29 |CRAN (R 4.4.1) |
|V8 |6.0.3 |2025-03-26 |CRAN (R 4.4.1) |
|vctrs |0.6.5 |2023-12-01 |CRAN (R 4.4.0) | |vctrs |0.6.5 |2023-12-01 |CRAN (R 4.4.0) |
|viridis |0.6.5 |2024-01-29 |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) | |vroom |1.6.5 |2023-12-05 |CRAN (R 4.4.0) |
|withr |3.0.2 |2024-10-28 |CRAN (R 4.4.1) | |withr |3.0.2 |2024-10-28 |CRAN (R 4.4.1) |
|writexl |1.5.4 |2025-04-15 |CRAN (R 4.4.1) | |writexl |1.5.4 |2025-04-15 |CRAN (R 4.4.1) |
@ -225,4 +245,5 @@
|xml2 |1.3.8 |2025-03-14 |CRAN (R 4.4.1) | |xml2 |1.3.8 |2025-03-14 |CRAN (R 4.4.1) |
|xtable |1.8-4 |2019-04-21 |CRAN (R 4.4.1) | |xtable |1.8-4 |2019-04-21 |CRAN (R 4.4.1) |
|yaml |2.3.10 |2024-07-26 |CRAN (R 4.4.1) | |yaml |2.3.10 |2024-07-26 |CRAN (R 4.4.1) |
|yesno |0.1.3 |2024-07-26 |CRAN (R 4.4.1) |
|zip |2.3.2 |2025-02-01 |CRAN (R 4.4.1) | |zip |2.3.2 |2025-02-01 |CRAN (R 4.4.1) |

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View file

@ -0,0 +1,29 @@
// Automatically close drop-downs on navigation
// Thanks to claude.ai
$(document).on('shown.bs.tab', '#main_panel', function(e) {
// Close dropdown in this specific navset only
$('#main_panel .dropdown-menu').removeClass('show');
$('#main_panel .dropdown-toggle').removeClass('show').attr('aria-expanded', 'false');
});
$(document).on('shiny:sessioninitialized', function() {
// Function to collapse navbar on mobile
function collapseNavbar() {
var navbar = $('.navbar-collapse');
if (navbar.hasClass('show')) {
navbar.removeClass('show');
$('.navbar-toggler').addClass('collapsed');
$('.navbar-toggler').attr('aria-expanded', 'false');
}
}
// Add click event to navigation tabs
$(document).on('click', '.nav-link[data-bs-toggle=\"tab\"]', function() {
setTimeout(collapseNavbar, 10);
});
// Also handle direct clicks on nav items
$(document).on('click', '.navbar-nav .nav-link', function() {
setTimeout(collapseNavbar, 10);
});
});

View file

@ -0,0 +1,29 @@
// Automatically close drop-downs on navigation
// Thanks to claude.ai
$(document).on('shown.bs.tab', '#main_panel', function(e) {
// Close dropdown in this specific navset only
$('#main_panel .dropdown-menu').removeClass('show');
$('#main_panel .dropdown-toggle').removeClass('show').attr('aria-expanded', 'false');
});
$(document).on('shiny:sessioninitialized', function() {
// Function to collapse navbar on mobile
function collapseNavbar() {
var navbar = $('.navbar-collapse');
if (navbar.hasClass('show')) {
navbar.removeClass('show');
$('.navbar-toggler').addClass('collapsed');
$('.navbar-toggler').attr('aria-expanded', 'false');
}
}
// Add click event to navigation tabs
$(document).on('click', '.nav-link[data-bs-toggle=\"tab\"]', function() {
setTimeout(collapseNavbar, 10);
});
// Also handle direct clicks on nav items
$(document).on('click', '.navbar-nav .nav-link', function() {
setTimeout(collapseNavbar, 10);
});
});

19
man/compare_missings.Rd Normal file
View file

@ -0,0 +1,19 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/missings-module.R
\name{compare_missings}
\alias{compare_missings}
\title{Pairwise comparison of missings across covariables}
\usage{
compare_missings(data, by_var)
}
\arguments{
\item{data}{data frame}
\item{by_var}{variable to stratify by missingness}
}
\value{
gtsummary list object
}
\description{
Pairwise comparison of missings across covariables
}

26
vignettes/missingness.Rmd Normal file
View file

@ -0,0 +1,26 @@
---
title: "Missingness in data"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{missingness}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
options(rmarkdown.html_vignette.check_title = FALSE)
```
```{r setup}
library(FreesearchR)
```
## Considering missing observations
### Further reading
The authors behind the [{finalfit}-package]() have shared a very comprehensive article on what to do and think about missing observations in your data. Please [have a look here]().