mirror of
https://github.com/agdamsbo/FreesearchR.git
synced 2026-06-19 12:37:30 +02:00
Compare commits
4 commits
4213487a77
...
41c855a71c
| Author | SHA1 | Date | |
|---|---|---|---|
|
41c855a71c |
|||
|
af4e21b836 |
|||
|
b2745f5628 |
|||
|
1e19486af1 |
28 changed files with 329 additions and 211 deletions
|
|
@ -8,7 +8,7 @@ message: 'To cite package "FreesearchR" in publications use:'
|
||||||
type: software
|
type: software
|
||||||
license: AGPL-3.0-or-later
|
license: AGPL-3.0-or-later
|
||||||
title: 'FreesearchR: Easy data analysis for clinicians'
|
title: 'FreesearchR: Easy data analysis for clinicians'
|
||||||
version: 26.4.1
|
version: 26.4.2
|
||||||
doi: 10.5281/zenodo.14527429
|
doi: 10.5281/zenodo.14527429
|
||||||
identifiers:
|
identifiers:
|
||||||
- type: url
|
- type: url
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
Package: FreesearchR
|
Package: FreesearchR
|
||||||
Title: Easy data analysis for clinicians
|
Title: Easy data analysis for clinicians
|
||||||
Version: 26.4.1
|
Version: 26.4.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")),
|
||||||
|
|
|
||||||
|
|
@ -116,6 +116,7 @@ export(modify_qmd)
|
||||||
export(names2val)
|
export(names2val)
|
||||||
export(overview_vars)
|
export(overview_vars)
|
||||||
export(pipe_string)
|
export(pipe_string)
|
||||||
|
export(plot_bar)
|
||||||
export(plot_bar_single)
|
export(plot_bar_single)
|
||||||
export(plot_box)
|
export(plot_box)
|
||||||
export(plot_box_single)
|
export(plot_box_single)
|
||||||
|
|
|
||||||
4
NEWS.md
4
NEWS.md
|
|
@ -1,3 +1,7 @@
|
||||||
|
# FreesearchR 26.4.2
|
||||||
|
|
||||||
|
Bug fixes and revised color choices.
|
||||||
|
|
||||||
# FreesearchR 26.4.1
|
# FreesearchR 26.4.1
|
||||||
|
|
||||||
Minor adjustments and bug fixes including streamlining icon use to only use phosphoricons across the app.
|
Minor adjustments and bug fixes including streamlining icon use to only use phosphoricons across the app.
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
app_version <- function()'26.4.1'
|
app_version <- function()'26.4.2'
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ create_column_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("compute"),
|
inputId = ns("compute"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("pencil"), i18n$t("Create column")
|
phosphoricons::ph("pencil",weight = "bold"), i18n$t("Create column")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary",
|
class = "btn-outline-primary",
|
||||||
width = "100%"
|
width = "100%"
|
||||||
|
|
@ -84,7 +84,7 @@ create_column_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("remove"),
|
inputId = ns("remove"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("x-circle"),
|
phosphoricons::ph("x-circle",weight = "bold"),
|
||||||
i18n$t("Cancel")
|
i18n$t("Cancel")
|
||||||
),
|
),
|
||||||
class = "btn-outline-danger",
|
class = "btn-outline-danger",
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ cut_variable_ui <- function(id) {
|
||||||
toastui::datagridOutput2(outputId = ns("count")),
|
toastui::datagridOutput2(outputId = ns("count")),
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("create"),
|
inputId = ns("create"),
|
||||||
label = tagList(phosphoricons::ph("scissors"), i18n$t("Create factor variable")),
|
label = tagList(phosphoricons::ph("scissors",weight = "bold"), i18n$t("Create factor variable")),
|
||||||
class = "btn-outline-primary float-end"
|
class = "btn-outline-primary float-end"
|
||||||
),
|
),
|
||||||
tags$div(class = "clearfix")
|
tags$div(class = "clearfix")
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ data_visuals_ui <- function(id, tab_title = "Plots", ...) {
|
||||||
inputId = ns("act_plot"),
|
inputId = ns("act_plot"),
|
||||||
label = i18n$t("Plot"),
|
label = i18n$t("Plot"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("paint-brush"),
|
icon = phosphoricons::ph("paint-brush",weight = "bold"),
|
||||||
# icon = shiny::icon("palette"),
|
# icon = shiny::icon("palette"),
|
||||||
disabled = FALSE
|
disabled = FALSE
|
||||||
),
|
),
|
||||||
|
|
@ -243,7 +243,8 @@ data_visuals_server <- function(id,
|
||||||
colorSelectInput(
|
colorSelectInput(
|
||||||
inputId = ns("color_palette"),
|
inputId = ns("color_palette"),
|
||||||
label = i18n$t("Choose color palette"),
|
label = i18n$t("Choose color palette"),
|
||||||
choices = palettes
|
choices = palettes,
|
||||||
|
previews = 5
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -721,6 +722,7 @@ wrap_plot_list <- function(data,
|
||||||
guides = "collect",
|
guides = "collect",
|
||||||
axes = "collect",
|
axes = "collect",
|
||||||
axis_titles = "collect",
|
axis_titles = "collect",
|
||||||
|
y.axis.percentage = FALSE,
|
||||||
...) {
|
...) {
|
||||||
if (ggplot2::is_ggplot(data[[1]])) {
|
if (ggplot2::is_ggplot(data[[1]])) {
|
||||||
if (length(data) > 1) {
|
if (length(data) > 1) {
|
||||||
|
|
@ -734,7 +736,7 @@ wrap_plot_list <- function(data,
|
||||||
.x
|
.x
|
||||||
}
|
}
|
||||||
})() |>
|
})() |>
|
||||||
align_axes() |>
|
align_axes(percentage=y.axis.percentage) |>
|
||||||
patchwork::wrap_plots(guides = guides,
|
patchwork::wrap_plots(guides = guides,
|
||||||
axes = axes,
|
axes = axes,
|
||||||
axis_titles = axis_titles,
|
axis_titles = axis_titles,
|
||||||
|
|
@ -779,7 +781,8 @@ wrap_plot_list <- function(data,
|
||||||
#'
|
#'
|
||||||
align_axes <- function(...,
|
align_axes <- function(...,
|
||||||
x.axis = TRUE,
|
x.axis = TRUE,
|
||||||
y.axis = TRUE) {
|
y.axis = TRUE,
|
||||||
|
percentage = FALSE) {
|
||||||
# https://stackoverflow.com/questions/62818776/get-axis-limits-from-ggplot-object
|
# https://stackoverflow.com/questions/62818776/get-axis-limits-from-ggplot-object
|
||||||
# https://github.com/thomasp85/patchwork/blob/main/R/plot_multipage.R#L150
|
# https://github.com/thomasp85/patchwork/blob/main/R/plot_multipage.R#L150
|
||||||
if (ggplot2::is_ggplot(..1)) {
|
if (ggplot2::is_ggplot(..1)) {
|
||||||
|
|
@ -797,7 +800,7 @@ align_axes <- function(...,
|
||||||
xr <- clean_common_axis(p, "x")
|
xr <- clean_common_axis(p, "x")
|
||||||
|
|
||||||
suppressWarnings({
|
suppressWarnings({
|
||||||
purrr::map(p, \(.x) {
|
p_out <- purrr::map(p, \(.x) {
|
||||||
out <- .x
|
out <- .x
|
||||||
if (isTRUE(x.axis)) {
|
if (isTRUE(x.axis)) {
|
||||||
out <- out + ggplot2::xlim(xr)
|
out <- out + ggplot2::xlim(xr)
|
||||||
|
|
@ -808,6 +811,15 @@ align_axes <- function(...,
|
||||||
out
|
out
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if(isTRUE(percentage)){
|
||||||
|
lapply(p_out,\(.x){
|
||||||
|
.x+
|
||||||
|
ggplot2::scale_y_continuous(labels = scales::percent)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
p_out
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#' Extract and clean axis ranges
|
#' Extract and clean axis ranges
|
||||||
|
|
|
||||||
|
|
@ -254,12 +254,12 @@ color_choices <- function() {
|
||||||
"Perceptual (blue-yellow)" = "viridis",
|
"Perceptual (blue-yellow)" = "viridis",
|
||||||
"Perceptual (fire)" = "plasma",
|
"Perceptual (fire)" = "plasma",
|
||||||
"Colour-blind friendly" = "Okabe-Ito",
|
"Colour-blind friendly" = "Okabe-Ito",
|
||||||
"Qualitative (bold)" = "Dark 2",
|
"Diverging (red-yellow-green)"= "RdYlGn",
|
||||||
"Qualitative (paired)" = "Paired",
|
|
||||||
"Sequential (blues)" = "Blues",
|
|
||||||
"Diverging (red-blue)" = "RdBu",
|
"Diverging (red-blue)" = "RdBu",
|
||||||
"Tableau style" = "Tableau 10",
|
"Sequential (blues)" = "Blues",
|
||||||
"Pastel" = "Pastel 1",
|
"Qualitative (paired)" = "Paired",
|
||||||
"Rainbow" = "rainbow"
|
"Qualitative (bold)" = "Dark 2",
|
||||||
|
"Rainbow" = "Spectral",
|
||||||
|
"Generic" = "Set1"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
hosted_version <- function()'v26.4.1-260402'
|
hosted_version <- function()'v26.4.2-260410'
|
||||||
|
|
|
||||||
|
|
@ -714,7 +714,7 @@ make_success_alert <- function(data,
|
||||||
i18n$t("Data ready to be imported!")
|
i18n$t("Data ready to be imported!")
|
||||||
),
|
),
|
||||||
sprintf(
|
sprintf(
|
||||||
i18n$t("Data has %s obs. of %s variables."),
|
i18n$t("The data set has %s obs. in %s variables."),
|
||||||
nrow(data),
|
nrow(data),
|
||||||
ncol(data)
|
ncol(data)
|
||||||
),
|
),
|
||||||
|
|
@ -725,7 +725,7 @@ make_success_alert <- function(data,
|
||||||
i18n$t("Data successfully imported!")
|
i18n$t("Data successfully imported!")
|
||||||
),
|
),
|
||||||
sprintf(
|
sprintf(
|
||||||
i18n$t("Data has %s obs. of %s variables."),
|
i18n$t("The data set has %s obs. in %s variables."),
|
||||||
nrow(data),
|
nrow(data),
|
||||||
ncol(data)
|
ncol(data)
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ data_missings_ui <- function(id, ...) {
|
||||||
inputId = ns("act_miss"),
|
inputId = ns("act_miss"),
|
||||||
label = i18n$t("Evaluate"),
|
label = i18n$t("Evaluate"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("calculator"),
|
icon = phosphoricons::ph("calculator",weight = "bold"),
|
||||||
# icon = shiny::icon("calculator"),
|
# icon = shiny::icon("calculator"),
|
||||||
disabled = TRUE
|
disabled = TRUE
|
||||||
)
|
)
|
||||||
|
|
|
||||||
90
R/plot_bar.R
90
R/plot_bar.R
|
|
@ -1,5 +1,29 @@
|
||||||
plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fill"),
|
#' Title
|
||||||
color.palette = "viridis", max_level = 30, ...) {
|
#'
|
||||||
|
#' @name data-plots
|
||||||
|
#'
|
||||||
|
#' @param style barplot style passed to geom_bar position argument.
|
||||||
|
#' One of c("stack", "dodge", "fill")
|
||||||
|
#'
|
||||||
|
#' @returns ggplot list object
|
||||||
|
#' @export
|
||||||
|
#'
|
||||||
|
#' @examples
|
||||||
|
#' mtcars |>
|
||||||
|
#' dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
||||||
|
#' plot_bar(pri = "cyl", sec = "am", style = "fill")
|
||||||
|
#'
|
||||||
|
#' mtcars |>
|
||||||
|
#' dplyr::mutate(dplyr::across(tidyselect::all_of(c("cyl","am","gear")),factor)) |>
|
||||||
|
#' plot_bar(pri = "cyl", sec = "gear", ter = "am", style = "stack",color.palette="turbo")
|
||||||
|
plot_bar <- function(data,
|
||||||
|
pri,
|
||||||
|
sec = NULL,
|
||||||
|
ter = NULL,
|
||||||
|
style = c("stack", "dodge", "fill"),
|
||||||
|
color.palette = "viridis",
|
||||||
|
max_level = 30,
|
||||||
|
...) {
|
||||||
style <- match.arg(style)
|
style <- match.arg(style)
|
||||||
|
|
||||||
if (!is.null(ter)) {
|
if (!is.null(ter)) {
|
||||||
|
|
@ -8,7 +32,7 @@ plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fi
|
||||||
ds <- list(data)
|
ds <- list(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
out <- lapply(ds, \(.ds){
|
out <- lapply(ds, \(.ds) {
|
||||||
plot_bar_single(
|
plot_bar_single(
|
||||||
data = .ds,
|
data = .ds,
|
||||||
pri = pri,
|
pri = pri,
|
||||||
|
|
@ -19,7 +43,10 @@ plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fi
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
wrap_plot_list(out, title = glue::glue(i18n$t("Grouped by {get_label(data,ter)}")), ...)
|
wrap_plot_list(out,
|
||||||
|
title = glue::glue(i18n$t("Grouped by {get_label(data,ter)}")),
|
||||||
|
y.axis.percentage = TRUE,
|
||||||
|
...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -41,7 +68,11 @@ plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fi
|
||||||
#' mtcars |>
|
#' mtcars |>
|
||||||
#' dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
#' dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
||||||
#' plot_bar_single(pri = "cyl", style = "stack",color.palette="turbo")
|
#' plot_bar_single(pri = "cyl", style = "stack",color.palette="turbo")
|
||||||
plot_bar_single <- function(data, pri, sec = NULL, style = c("stack", "dodge", "fill"), max_level = 30,
|
plot_bar_single <- function(data,
|
||||||
|
pri,
|
||||||
|
sec = NULL,
|
||||||
|
style = c("stack", "dodge", "fill"),
|
||||||
|
max_level = 30,
|
||||||
color.palette = "viridis") {
|
color.palette = "viridis") {
|
||||||
style <- match.arg(style)
|
style <- match.arg(style)
|
||||||
|
|
||||||
|
|
@ -51,16 +82,11 @@ plot_bar_single <- function(data, pri, sec = NULL, style = c("stack", "dodge", "
|
||||||
|
|
||||||
p_data <- as.data.frame(table(data[c(pri, sec)])) |>
|
p_data <- as.data.frame(table(data[c(pri, sec)])) |>
|
||||||
dplyr::mutate(dplyr::across(tidyselect::any_of(c(pri, sec)), forcats::as_factor),
|
dplyr::mutate(dplyr::across(tidyselect::any_of(c(pri, sec)), forcats::as_factor),
|
||||||
p = Freq / NROW(data)
|
p = Freq / NROW(data))
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if (nrow(p_data) > max_level) {
|
if (nrow(p_data) > max_level) {
|
||||||
p_data <- sort_by(
|
p_data <- sort_by(p_data, p_data[["Freq"]], decreasing = TRUE) |>
|
||||||
p_data,
|
|
||||||
p_data[["Freq"]],
|
|
||||||
decreasing = TRUE
|
|
||||||
) |>
|
|
||||||
head(max_level)
|
head(max_level)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -73,39 +99,31 @@ plot_bar_single <- function(data, pri, sec = NULL, style = c("stack", "dodge", "
|
||||||
fill <- pri
|
fill <- pri
|
||||||
}
|
}
|
||||||
|
|
||||||
p <- ggplot2::ggplot(
|
p <- ggplot2::ggplot(p_data, ggplot2::aes(x = .data[[pri]], y = p, fill = .data[[fill]])) +
|
||||||
p_data,
|
|
||||||
ggplot2::aes(
|
|
||||||
x = .data[[pri]],
|
|
||||||
y = p,
|
|
||||||
fill = .data[[fill]]
|
|
||||||
)
|
|
||||||
) +
|
|
||||||
ggplot2::geom_bar(position = style, stat = "identity") +
|
ggplot2::geom_bar(position = style, stat = "identity") +
|
||||||
ggplot2::scale_y_continuous(labels = scales::percent) +
|
scale_fill_generate(palette = color.palette) +
|
||||||
scale_fill_generate(palette=color.palette) +
|
ggplot2::xlab(get_label(data, pri)) +
|
||||||
ggplot2::ylab("Percentage") +
|
ggplot2::guides(fill = ggplot2::guide_legend(title = get_label(data, fill)))
|
||||||
ggplot2::xlab(get_label(data,pri))+
|
|
||||||
ggplot2::guides(fill = ggplot2::guide_legend(title = get_label(data,fill)))
|
|
||||||
|
|
||||||
## To handle large number of levels and long level names
|
## To handle large number of levels and long level names
|
||||||
|
|
||||||
if (nrow(p_data) > 10 | any(nchar(as.character(p_data[[pri]])) > 6)) {
|
if (nrow(p_data) > 10 |
|
||||||
|
any(nchar(as.character(p_data[[pri]])) > 6)) {
|
||||||
p <- p +
|
p <- p +
|
||||||
# ggplot2::guides(fill = "none") +
|
# ggplot2::guides(fill = "none") +
|
||||||
ggplot2::theme(
|
ggplot2::theme(axis.text.x = ggplot2::element_text(
|
||||||
axis.text.x = ggplot2::element_text(
|
angle = 90,
|
||||||
angle = 90,
|
vjust = 1,
|
||||||
vjust = 1, hjust = 1
|
hjust = 1
|
||||||
))+
|
)) +
|
||||||
ggplot2::theme(
|
ggplot2::theme(axis.text.x = ggplot2::element_text(vjust = 0.5))
|
||||||
axis.text.x = ggplot2::element_text(vjust = 0.5)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (is.null(sec)){
|
if (is.null(sec)) {
|
||||||
p <- p +
|
p <- p +
|
||||||
ggplot2::guides(fill = "none")
|
ggplot2::guides(fill = "none")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p
|
p +
|
||||||
|
ggplot2::scale_y_continuous(labels = scales::percent) +
|
||||||
|
ggplot2::ylab("Percentage")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ string_split_ui <- function(id) {
|
||||||
),
|
),
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("create"),
|
inputId = ns("create"),
|
||||||
label = tagList(phosphoricons::ph("pencil"), i18n$t("Apply split")),
|
label = tagList(phosphoricons::ph("pencil",weight = "bold"), i18n$t("Apply split")),
|
||||||
class = "btn-outline-primary float-end"
|
class = "btn-outline-primary float-end"
|
||||||
),
|
),
|
||||||
tags$div(class = "clearfix")
|
tags$div(class = "clearfix")
|
||||||
|
|
|
||||||
BIN
R/sysdata.rda
BIN
R/sysdata.rda
Binary file not shown.
|
|
@ -124,7 +124,7 @@ ui_elements <- function(selection) {
|
||||||
inputId = "modal_initial_view",
|
inputId = "modal_initial_view",
|
||||||
label = i18n$t("Quick overview"),
|
label = i18n$t("Quick overview"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("binoculars"),
|
icon = phosphoricons::ph("binoculars",weight = "bold"),
|
||||||
# icon = shiny::icon("binoculars"),
|
# icon = shiny::icon("binoculars"),
|
||||||
disabled = FALSE
|
disabled = FALSE
|
||||||
),
|
),
|
||||||
|
|
@ -169,7 +169,7 @@ ui_elements <- function(selection) {
|
||||||
inputId = "act_start",
|
inputId = "act_start",
|
||||||
label = i18n$t("Let's begin!"),
|
label = i18n$t("Let's begin!"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("play"),
|
icon = phosphoricons::ph("play",weight = "bold"),
|
||||||
# icon = shiny::icon("play"),
|
# icon = shiny::icon("play"),
|
||||||
disabled = TRUE
|
disabled = TRUE
|
||||||
),
|
),
|
||||||
|
|
@ -460,7 +460,7 @@ ui_elements <- function(selection) {
|
||||||
inputId = "act_eval",
|
inputId = "act_eval",
|
||||||
label = i18n$t("Evaluate"),
|
label = i18n$t("Evaluate"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("calculator"),
|
icon = phosphoricons::ph("calculator",weight = "bold"),
|
||||||
# icon = shiny::icon("calculator"),
|
# icon = shiny::icon("calculator"),
|
||||||
disabled = TRUE
|
disabled = TRUE
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
disabled = TRUE,
|
disabled = TRUE,
|
||||||
inputId = ns("drop_levels"),
|
inputId = ns("drop_levels"),
|
||||||
label = tagList(phosphoricons::ph("trash"), i18n$t("Drop empty")),
|
label = tagList(phosphoricons::ph("trash",weight = "bold"), i18n$t("Drop empty")),
|
||||||
class = "btn-outline-primary mb-3",
|
class = "btn-outline-primary mb-3",
|
||||||
width = "100%"
|
width = "100%"
|
||||||
)
|
)
|
||||||
|
|
@ -55,7 +55,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("sort_levels"),
|
inputId = ns("sort_levels"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("sort-ascending"),
|
phosphoricons::ph("sort-ascending",weight = "bold"),
|
||||||
i18n$t("Sort by levels")
|
i18n$t("Sort by levels")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary mb-3",
|
class = "btn-outline-primary mb-3",
|
||||||
|
|
@ -68,7 +68,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("sort_occurrences"),
|
inputId = ns("sort_occurrences"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("sort-ascending"),
|
phosphoricons::ph("sort-ascending",weight = "bold"),
|
||||||
i18n$t("Sort by count")
|
i18n$t("Sort by count")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary mb-3",
|
class = "btn-outline-primary mb-3",
|
||||||
|
|
@ -92,7 +92,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("create"),
|
inputId = ns("create"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("arrow-clockwise"),
|
phosphoricons::ph("arrow-clockwise",weight = "bold"),
|
||||||
i18n$t("Update factor variable")
|
i18n$t("Update factor variable")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary"
|
class = "btn-outline-primary"
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ update_variables_ui <- function(id, title = "") {
|
||||||
placement = "bottom-end",
|
placement = "bottom-end",
|
||||||
shiny::actionButton(
|
shiny::actionButton(
|
||||||
inputId = ns("settings"),
|
inputId = ns("settings"),
|
||||||
label = phosphoricons::ph("gear"),
|
label = phosphoricons::ph("gear",weight = "bold"),
|
||||||
class = "pull-right float-right"
|
class = "pull-right float-right"
|
||||||
),
|
),
|
||||||
shinyWidgets::textInputIcon(
|
shinyWidgets::textInputIcon(
|
||||||
|
|
@ -75,7 +75,7 @@ update_variables_ui <- function(id, title = "") {
|
||||||
shiny::actionButton(
|
shiny::actionButton(
|
||||||
inputId = ns("validate"),
|
inputId = ns("validate"),
|
||||||
label = htmltools::tagList(
|
label = htmltools::tagList(
|
||||||
phosphoricons::ph("arrow-circle-right", title = i18n$t("Apply changes")),
|
phosphoricons::ph("arrow-circle-right", title = i18n$t("Apply changes"),weight = "bold"),
|
||||||
i18n$t("Apply changes")
|
i18n$t("Apply changes")
|
||||||
),
|
),
|
||||||
width = "100%"
|
width = "100%"
|
||||||
|
|
|
||||||
|
|
@ -4,18 +4,18 @@
|
||||||
|setting |value |
|
|setting |value |
|
||||||
|:-----------|:------------------------------------------|
|
|:-----------|:------------------------------------------|
|
||||||
|version |R version 4.5.2 (2025-10-31) |
|
|version |R version 4.5.2 (2025-10-31) |
|
||||||
|os |macOS Tahoe 26.4 |
|
|os |macOS Tahoe 26.4.1 |
|
||||||
|system |aarch64, darwin20 |
|
|system |aarch64, darwin20 |
|
||||||
|ui |RStudio |
|
|ui |RStudio |
|
||||||
|language |(EN) |
|
|language |(EN) |
|
||||||
|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 |2026-04-01 |
|
|date |2026-04-10 |
|
||||||
|rstudio |2026.01.1+403 Apple Blossom (desktop) |
|
|rstudio |2026.01.1+403 Apple Blossom (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 |26.4.1.260401 |
|
|FreesearchR |26.4.2.260410 |
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
@ -83,7 +83,7 @@
|
||||||
|foreach |1.5.2 |2022-02-02 |CRAN (R 4.5.0) |
|
|foreach |1.5.2 |2022-02-02 |CRAN (R 4.5.0) |
|
||||||
|foreign |0.8-91 |2026-01-29 |CRAN (R 4.5.2) |
|
|foreign |0.8-91 |2026-01-29 |CRAN (R 4.5.2) |
|
||||||
|Formula |1.2-5 |2023-02-24 |CRAN (R 4.5.0) |
|
|Formula |1.2-5 |2023-02-24 |CRAN (R 4.5.0) |
|
||||||
|FreesearchR |26.4.1 |NA |NA |
|
|FreesearchR |26.4.2 |NA |NA |
|
||||||
|fs |1.6.7 |2026-03-06 |CRAN (R 4.5.2) |
|
|fs |1.6.7 |2026-03-06 |CRAN (R 4.5.2) |
|
||||||
|gdtools |0.5.0 |2026-02-09 |CRAN (R 4.5.2) |
|
|gdtools |0.5.0 |2026-02-09 |CRAN (R 4.5.2) |
|
||||||
|generics |0.1.4 |2025-05-09 |CRAN (R 4.5.0) |
|
|generics |0.1.4 |2025-05-09 |CRAN (R 4.5.0) |
|
||||||
|
|
@ -147,7 +147,6 @@
|
||||||
|pkgload |1.5.0 |2026-02-03 |CRAN (R 4.5.2) |
|
|pkgload |1.5.0 |2026-02-03 |CRAN (R 4.5.2) |
|
||||||
|plyr |1.8.9 |2023-10-02 |CRAN (R 4.5.0) |
|
|plyr |1.8.9 |2023-10-02 |CRAN (R 4.5.0) |
|
||||||
|polyclip |1.10-7 |2024-07-23 |CRAN (R 4.5.0) |
|
|polyclip |1.10-7 |2024-07-23 |CRAN (R 4.5.0) |
|
||||||
|polylabelr |1.0.0 |2026-01-19 |CRAN (R 4.5.2) |
|
|
||||||
|pracma |2.4.6 |2025-10-22 |CRAN (R 4.5.0) |
|
|pracma |2.4.6 |2025-10-22 |CRAN (R 4.5.0) |
|
||||||
|processx |3.8.6 |2025-02-21 |CRAN (R 4.5.0) |
|
|processx |3.8.6 |2025-02-21 |CRAN (R 4.5.0) |
|
||||||
|promises |1.5.0 |2025-11-01 |CRAN (R 4.5.0) |
|
|promises |1.5.0 |2025-11-01 |CRAN (R 4.5.0) |
|
||||||
|
|
|
||||||
162
app_docker/app.R
162
app_docker/app.R
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
|
|
||||||
########
|
########
|
||||||
#### Current file: /var/folders/9l/xbc19wxx0g79jdd2sf_0v291mhwh7f/T//RtmpmlTuE8/file8be05102425f.R
|
#### Current file: /var/folders/9l/xbc19wxx0g79jdd2sf_0v291mhwh7f/T//RtmprUCGcI/file4761ae70bf7.R
|
||||||
########
|
########
|
||||||
|
|
||||||
i18n_path <- here::here("translations")
|
i18n_path <- here::here("translations")
|
||||||
|
|
@ -64,7 +64,7 @@ i18n$set_translation_language("en")
|
||||||
#### Current file: /Users/au301842/FreesearchR/R//app_version.R
|
#### Current file: /Users/au301842/FreesearchR/R//app_version.R
|
||||||
########
|
########
|
||||||
|
|
||||||
app_version <- function()'26.4.1'
|
app_version <- function()'26.4.2'
|
||||||
|
|
||||||
|
|
||||||
########
|
########
|
||||||
|
|
@ -512,7 +512,7 @@ create_column_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("compute"),
|
inputId = ns("compute"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("pencil"), i18n$t("Create column")
|
phosphoricons::ph("pencil",weight = "bold"), i18n$t("Create column")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary",
|
class = "btn-outline-primary",
|
||||||
width = "100%"
|
width = "100%"
|
||||||
|
|
@ -520,7 +520,7 @@ create_column_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("remove"),
|
inputId = ns("remove"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("x-circle"),
|
phosphoricons::ph("x-circle",weight = "bold"),
|
||||||
i18n$t("Cancel")
|
i18n$t("Cancel")
|
||||||
),
|
),
|
||||||
class = "btn-outline-danger",
|
class = "btn-outline-danger",
|
||||||
|
|
@ -1568,7 +1568,7 @@ cut_variable_ui <- function(id) {
|
||||||
toastui::datagridOutput2(outputId = ns("count")),
|
toastui::datagridOutput2(outputId = ns("count")),
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("create"),
|
inputId = ns("create"),
|
||||||
label = tagList(phosphoricons::ph("scissors"), i18n$t("Create factor variable")),
|
label = tagList(phosphoricons::ph("scissors",weight = "bold"), i18n$t("Create factor variable")),
|
||||||
class = "btn-outline-primary float-end"
|
class = "btn-outline-primary float-end"
|
||||||
),
|
),
|
||||||
tags$div(class = "clearfix")
|
tags$div(class = "clearfix")
|
||||||
|
|
@ -2175,7 +2175,7 @@ data_visuals_ui <- function(id, tab_title = "Plots", ...) {
|
||||||
inputId = ns("act_plot"),
|
inputId = ns("act_plot"),
|
||||||
label = i18n$t("Plot"),
|
label = i18n$t("Plot"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("paint-brush"),
|
icon = phosphoricons::ph("paint-brush",weight = "bold"),
|
||||||
# icon = shiny::icon("palette"),
|
# icon = shiny::icon("palette"),
|
||||||
disabled = FALSE
|
disabled = FALSE
|
||||||
),
|
),
|
||||||
|
|
@ -2380,7 +2380,8 @@ data_visuals_server <- function(id,
|
||||||
colorSelectInput(
|
colorSelectInput(
|
||||||
inputId = ns("color_palette"),
|
inputId = ns("color_palette"),
|
||||||
label = i18n$t("Choose color palette"),
|
label = i18n$t("Choose color palette"),
|
||||||
choices = palettes
|
choices = palettes,
|
||||||
|
previews = 5
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -2858,6 +2859,7 @@ wrap_plot_list <- function(data,
|
||||||
guides = "collect",
|
guides = "collect",
|
||||||
axes = "collect",
|
axes = "collect",
|
||||||
axis_titles = "collect",
|
axis_titles = "collect",
|
||||||
|
y.axis.percentage = FALSE,
|
||||||
...) {
|
...) {
|
||||||
if (ggplot2::is_ggplot(data[[1]])) {
|
if (ggplot2::is_ggplot(data[[1]])) {
|
||||||
if (length(data) > 1) {
|
if (length(data) > 1) {
|
||||||
|
|
@ -2871,7 +2873,7 @@ wrap_plot_list <- function(data,
|
||||||
.x
|
.x
|
||||||
}
|
}
|
||||||
})() |>
|
})() |>
|
||||||
align_axes() |>
|
align_axes(percentage=y.axis.percentage) |>
|
||||||
patchwork::wrap_plots(guides = guides,
|
patchwork::wrap_plots(guides = guides,
|
||||||
axes = axes,
|
axes = axes,
|
||||||
axis_titles = axis_titles,
|
axis_titles = axis_titles,
|
||||||
|
|
@ -2916,7 +2918,8 @@ wrap_plot_list <- function(data,
|
||||||
#'
|
#'
|
||||||
align_axes <- function(...,
|
align_axes <- function(...,
|
||||||
x.axis = TRUE,
|
x.axis = TRUE,
|
||||||
y.axis = TRUE) {
|
y.axis = TRUE,
|
||||||
|
percentage = FALSE) {
|
||||||
# https://stackoverflow.com/questions/62818776/get-axis-limits-from-ggplot-object
|
# https://stackoverflow.com/questions/62818776/get-axis-limits-from-ggplot-object
|
||||||
# https://github.com/thomasp85/patchwork/blob/main/R/plot_multipage.R#L150
|
# https://github.com/thomasp85/patchwork/blob/main/R/plot_multipage.R#L150
|
||||||
if (ggplot2::is_ggplot(..1)) {
|
if (ggplot2::is_ggplot(..1)) {
|
||||||
|
|
@ -2934,7 +2937,7 @@ align_axes <- function(...,
|
||||||
xr <- clean_common_axis(p, "x")
|
xr <- clean_common_axis(p, "x")
|
||||||
|
|
||||||
suppressWarnings({
|
suppressWarnings({
|
||||||
purrr::map(p, \(.x) {
|
p_out <- purrr::map(p, \(.x) {
|
||||||
out <- .x
|
out <- .x
|
||||||
if (isTRUE(x.axis)) {
|
if (isTRUE(x.axis)) {
|
||||||
out <- out + ggplot2::xlim(xr)
|
out <- out + ggplot2::xlim(xr)
|
||||||
|
|
@ -2945,6 +2948,15 @@ align_axes <- function(...,
|
||||||
out
|
out
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if(isTRUE(percentage)){
|
||||||
|
lapply(p_out,\(.x){
|
||||||
|
.x+
|
||||||
|
ggplot2::scale_y_continuous(labels = scales::percent)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
p_out
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#' Extract and clean axis ranges
|
#' Extract and clean axis ranges
|
||||||
|
|
@ -4031,13 +4043,13 @@ color_choices <- function() {
|
||||||
"Perceptual (blue-yellow)" = "viridis",
|
"Perceptual (blue-yellow)" = "viridis",
|
||||||
"Perceptual (fire)" = "plasma",
|
"Perceptual (fire)" = "plasma",
|
||||||
"Colour-blind friendly" = "Okabe-Ito",
|
"Colour-blind friendly" = "Okabe-Ito",
|
||||||
"Qualitative (bold)" = "Dark 2",
|
"Diverging (red-yellow-green)"= "RdYlGn",
|
||||||
"Qualitative (paired)" = "Paired",
|
|
||||||
"Sequential (blues)" = "Blues",
|
|
||||||
"Diverging (red-blue)" = "RdBu",
|
"Diverging (red-blue)" = "RdBu",
|
||||||
"Tableau style" = "Tableau 10",
|
"Sequential (blues)" = "Blues",
|
||||||
"Pastel" = "Pastel 1",
|
"Qualitative (paired)" = "Paired",
|
||||||
"Rainbow" = "rainbow"
|
"Qualitative (bold)" = "Dark 2",
|
||||||
|
"Rainbow" = "Spectral",
|
||||||
|
"Generic" = "Set1"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4945,7 +4957,7 @@ apply_idea_filter <- function(filtered_reactive, df_target, env = parent.frame()
|
||||||
#### Current file: /Users/au301842/FreesearchR/R//hosted_version.R
|
#### Current file: /Users/au301842/FreesearchR/R//hosted_version.R
|
||||||
########
|
########
|
||||||
|
|
||||||
hosted_version <- function()'v26.4.1-260402'
|
hosted_version <- function()'v26.4.2-260410'
|
||||||
|
|
||||||
|
|
||||||
########
|
########
|
||||||
|
|
@ -6085,7 +6097,7 @@ make_success_alert <- function(data,
|
||||||
i18n$t("Data ready to be imported!")
|
i18n$t("Data ready to be imported!")
|
||||||
),
|
),
|
||||||
sprintf(
|
sprintf(
|
||||||
i18n$t("Data has %s obs. of %s variables."),
|
i18n$t("The data set has %s obs. in %s variables."),
|
||||||
nrow(data),
|
nrow(data),
|
||||||
ncol(data)
|
ncol(data)
|
||||||
),
|
),
|
||||||
|
|
@ -6096,7 +6108,7 @@ make_success_alert <- function(data,
|
||||||
i18n$t("Data successfully imported!")
|
i18n$t("Data successfully imported!")
|
||||||
),
|
),
|
||||||
sprintf(
|
sprintf(
|
||||||
i18n$t("Data has %s obs. of %s variables."),
|
i18n$t("The data set has %s obs. in %s variables."),
|
||||||
nrow(data),
|
nrow(data),
|
||||||
ncol(data)
|
ncol(data)
|
||||||
),
|
),
|
||||||
|
|
@ -6581,7 +6593,7 @@ data_missings_ui <- function(id, ...) {
|
||||||
inputId = ns("act_miss"),
|
inputId = ns("act_miss"),
|
||||||
label = i18n$t("Evaluate"),
|
label = i18n$t("Evaluate"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("calculator"),
|
icon = phosphoricons::ph("calculator",weight = "bold"),
|
||||||
# icon = shiny::icon("calculator"),
|
# icon = shiny::icon("calculator"),
|
||||||
disabled = TRUE
|
disabled = TRUE
|
||||||
)
|
)
|
||||||
|
|
@ -6918,8 +6930,32 @@ missings_logic_across <- function(data, exclude = NULL) {
|
||||||
#### Current file: /Users/au301842/FreesearchR/R//plot_bar.R
|
#### Current file: /Users/au301842/FreesearchR/R//plot_bar.R
|
||||||
########
|
########
|
||||||
|
|
||||||
plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fill"),
|
#' Title
|
||||||
color.palette = "viridis", max_level = 30, ...) {
|
#'
|
||||||
|
#' @name data-plots
|
||||||
|
#'
|
||||||
|
#' @param style barplot style passed to geom_bar position argument.
|
||||||
|
#' One of c("stack", "dodge", "fill")
|
||||||
|
#'
|
||||||
|
#' @returns ggplot list object
|
||||||
|
#' @export
|
||||||
|
#'
|
||||||
|
#' @examples
|
||||||
|
#' mtcars |>
|
||||||
|
#' dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
||||||
|
#' plot_bar(pri = "cyl", sec = "am", style = "fill")
|
||||||
|
#'
|
||||||
|
#' mtcars |>
|
||||||
|
#' dplyr::mutate(dplyr::across(tidyselect::all_of(c("cyl","am","gear")),factor)) |>
|
||||||
|
#' plot_bar(pri = "cyl", sec = "gear", ter = "am", style = "stack",color.palette="turbo")
|
||||||
|
plot_bar <- function(data,
|
||||||
|
pri,
|
||||||
|
sec = NULL,
|
||||||
|
ter = NULL,
|
||||||
|
style = c("stack", "dodge", "fill"),
|
||||||
|
color.palette = "viridis",
|
||||||
|
max_level = 30,
|
||||||
|
...) {
|
||||||
style <- match.arg(style)
|
style <- match.arg(style)
|
||||||
|
|
||||||
if (!is.null(ter)) {
|
if (!is.null(ter)) {
|
||||||
|
|
@ -6928,7 +6964,7 @@ plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fi
|
||||||
ds <- list(data)
|
ds <- list(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
out <- lapply(ds, \(.ds){
|
out <- lapply(ds, \(.ds) {
|
||||||
plot_bar_single(
|
plot_bar_single(
|
||||||
data = .ds,
|
data = .ds,
|
||||||
pri = pri,
|
pri = pri,
|
||||||
|
|
@ -6939,7 +6975,10 @@ plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fi
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
wrap_plot_list(out, title = glue::glue(i18n$t("Grouped by {get_label(data,ter)}")), ...)
|
wrap_plot_list(out,
|
||||||
|
title = glue::glue(i18n$t("Grouped by {get_label(data,ter)}")),
|
||||||
|
y.axis.percentage = TRUE,
|
||||||
|
...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -6961,7 +7000,11 @@ plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fi
|
||||||
#' mtcars |>
|
#' mtcars |>
|
||||||
#' dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
#' dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
||||||
#' plot_bar_single(pri = "cyl", style = "stack",color.palette="turbo")
|
#' plot_bar_single(pri = "cyl", style = "stack",color.palette="turbo")
|
||||||
plot_bar_single <- function(data, pri, sec = NULL, style = c("stack", "dodge", "fill"), max_level = 30,
|
plot_bar_single <- function(data,
|
||||||
|
pri,
|
||||||
|
sec = NULL,
|
||||||
|
style = c("stack", "dodge", "fill"),
|
||||||
|
max_level = 30,
|
||||||
color.palette = "viridis") {
|
color.palette = "viridis") {
|
||||||
style <- match.arg(style)
|
style <- match.arg(style)
|
||||||
|
|
||||||
|
|
@ -6971,16 +7014,11 @@ plot_bar_single <- function(data, pri, sec = NULL, style = c("stack", "dodge", "
|
||||||
|
|
||||||
p_data <- as.data.frame(table(data[c(pri, sec)])) |>
|
p_data <- as.data.frame(table(data[c(pri, sec)])) |>
|
||||||
dplyr::mutate(dplyr::across(tidyselect::any_of(c(pri, sec)), forcats::as_factor),
|
dplyr::mutate(dplyr::across(tidyselect::any_of(c(pri, sec)), forcats::as_factor),
|
||||||
p = Freq / NROW(data)
|
p = Freq / NROW(data))
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if (nrow(p_data) > max_level) {
|
if (nrow(p_data) > max_level) {
|
||||||
p_data <- sort_by(
|
p_data <- sort_by(p_data, p_data[["Freq"]], decreasing = TRUE) |>
|
||||||
p_data,
|
|
||||||
p_data[["Freq"]],
|
|
||||||
decreasing = TRUE
|
|
||||||
) |>
|
|
||||||
head(max_level)
|
head(max_level)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6993,41 +7031,33 @@ plot_bar_single <- function(data, pri, sec = NULL, style = c("stack", "dodge", "
|
||||||
fill <- pri
|
fill <- pri
|
||||||
}
|
}
|
||||||
|
|
||||||
p <- ggplot2::ggplot(
|
p <- ggplot2::ggplot(p_data, ggplot2::aes(x = .data[[pri]], y = p, fill = .data[[fill]])) +
|
||||||
p_data,
|
|
||||||
ggplot2::aes(
|
|
||||||
x = .data[[pri]],
|
|
||||||
y = p,
|
|
||||||
fill = .data[[fill]]
|
|
||||||
)
|
|
||||||
) +
|
|
||||||
ggplot2::geom_bar(position = style, stat = "identity") +
|
ggplot2::geom_bar(position = style, stat = "identity") +
|
||||||
ggplot2::scale_y_continuous(labels = scales::percent) +
|
scale_fill_generate(palette = color.palette) +
|
||||||
scale_fill_generate(palette=color.palette) +
|
ggplot2::xlab(get_label(data, pri)) +
|
||||||
ggplot2::ylab("Percentage") +
|
ggplot2::guides(fill = ggplot2::guide_legend(title = get_label(data, fill)))
|
||||||
ggplot2::xlab(get_label(data,pri))+
|
|
||||||
ggplot2::guides(fill = ggplot2::guide_legend(title = get_label(data,fill)))
|
|
||||||
|
|
||||||
## To handle large number of levels and long level names
|
## To handle large number of levels and long level names
|
||||||
|
|
||||||
if (nrow(p_data) > 10 | any(nchar(as.character(p_data[[pri]])) > 6)) {
|
if (nrow(p_data) > 10 |
|
||||||
|
any(nchar(as.character(p_data[[pri]])) > 6)) {
|
||||||
p <- p +
|
p <- p +
|
||||||
# ggplot2::guides(fill = "none") +
|
# ggplot2::guides(fill = "none") +
|
||||||
ggplot2::theme(
|
ggplot2::theme(axis.text.x = ggplot2::element_text(
|
||||||
axis.text.x = ggplot2::element_text(
|
angle = 90,
|
||||||
angle = 90,
|
vjust = 1,
|
||||||
vjust = 1, hjust = 1
|
hjust = 1
|
||||||
))+
|
)) +
|
||||||
ggplot2::theme(
|
ggplot2::theme(axis.text.x = ggplot2::element_text(vjust = 0.5))
|
||||||
axis.text.x = ggplot2::element_text(vjust = 0.5)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (is.null(sec)){
|
if (is.null(sec)) {
|
||||||
p <- p +
|
p <- p +
|
||||||
ggplot2::guides(fill = "none")
|
ggplot2::guides(fill = "none")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p
|
p +
|
||||||
|
ggplot2::scale_y_continuous(labels = scales::percent) +
|
||||||
|
ggplot2::ylab("Percentage")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -10965,7 +10995,7 @@ string_split_ui <- function(id) {
|
||||||
),
|
),
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("create"),
|
inputId = ns("create"),
|
||||||
label = tagList(phosphoricons::ph("pencil"), i18n$t("Apply split")),
|
label = tagList(phosphoricons::ph("pencil",weight = "bold"), i18n$t("Apply split")),
|
||||||
class = "btn-outline-primary float-end"
|
class = "btn-outline-primary float-end"
|
||||||
),
|
),
|
||||||
tags$div(class = "clearfix")
|
tags$div(class = "clearfix")
|
||||||
|
|
@ -11850,7 +11880,7 @@ ui_elements <- function(selection) {
|
||||||
inputId = "modal_initial_view",
|
inputId = "modal_initial_view",
|
||||||
label = i18n$t("Quick overview"),
|
label = i18n$t("Quick overview"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("binoculars"),
|
icon = phosphoricons::ph("binoculars",weight = "bold"),
|
||||||
# icon = shiny::icon("binoculars"),
|
# icon = shiny::icon("binoculars"),
|
||||||
disabled = FALSE
|
disabled = FALSE
|
||||||
),
|
),
|
||||||
|
|
@ -11895,7 +11925,7 @@ ui_elements <- function(selection) {
|
||||||
inputId = "act_start",
|
inputId = "act_start",
|
||||||
label = i18n$t("Let's begin!"),
|
label = i18n$t("Let's begin!"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("play"),
|
icon = phosphoricons::ph("play",weight = "bold"),
|
||||||
# icon = shiny::icon("play"),
|
# icon = shiny::icon("play"),
|
||||||
disabled = TRUE
|
disabled = TRUE
|
||||||
),
|
),
|
||||||
|
|
@ -12186,7 +12216,7 @@ ui_elements <- function(selection) {
|
||||||
inputId = "act_eval",
|
inputId = "act_eval",
|
||||||
label = i18n$t("Evaluate"),
|
label = i18n$t("Evaluate"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("calculator"),
|
icon = phosphoricons::ph("calculator",weight = "bold"),
|
||||||
# icon = shiny::icon("calculator"),
|
# icon = shiny::icon("calculator"),
|
||||||
disabled = TRUE
|
disabled = TRUE
|
||||||
),
|
),
|
||||||
|
|
@ -12497,7 +12527,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
disabled = TRUE,
|
disabled = TRUE,
|
||||||
inputId = ns("drop_levels"),
|
inputId = ns("drop_levels"),
|
||||||
label = tagList(phosphoricons::ph("trash"), i18n$t("Drop empty")),
|
label = tagList(phosphoricons::ph("trash",weight = "bold"), i18n$t("Drop empty")),
|
||||||
class = "btn-outline-primary mb-3",
|
class = "btn-outline-primary mb-3",
|
||||||
width = "100%"
|
width = "100%"
|
||||||
)
|
)
|
||||||
|
|
@ -12508,7 +12538,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("sort_levels"),
|
inputId = ns("sort_levels"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("sort-ascending"),
|
phosphoricons::ph("sort-ascending",weight = "bold"),
|
||||||
i18n$t("Sort by levels")
|
i18n$t("Sort by levels")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary mb-3",
|
class = "btn-outline-primary mb-3",
|
||||||
|
|
@ -12521,7 +12551,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("sort_occurrences"),
|
inputId = ns("sort_occurrences"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("sort-ascending"),
|
phosphoricons::ph("sort-ascending",weight = "bold"),
|
||||||
i18n$t("Sort by count")
|
i18n$t("Sort by count")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary mb-3",
|
class = "btn-outline-primary mb-3",
|
||||||
|
|
@ -12545,7 +12575,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("create"),
|
inputId = ns("create"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("arrow-clockwise"),
|
phosphoricons::ph("arrow-clockwise",weight = "bold"),
|
||||||
i18n$t("Update factor variable")
|
i18n$t("Update factor variable")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary"
|
class = "btn-outline-primary"
|
||||||
|
|
@ -12897,7 +12927,7 @@ update_variables_ui <- function(id, title = "") {
|
||||||
placement = "bottom-end",
|
placement = "bottom-end",
|
||||||
shiny::actionButton(
|
shiny::actionButton(
|
||||||
inputId = ns("settings"),
|
inputId = ns("settings"),
|
||||||
label = phosphoricons::ph("gear"),
|
label = phosphoricons::ph("gear",weight = "bold"),
|
||||||
class = "pull-right float-right"
|
class = "pull-right float-right"
|
||||||
),
|
),
|
||||||
shinyWidgets::textInputIcon(
|
shinyWidgets::textInputIcon(
|
||||||
|
|
@ -12942,7 +12972,7 @@ update_variables_ui <- function(id, title = "") {
|
||||||
shiny::actionButton(
|
shiny::actionButton(
|
||||||
inputId = ns("validate"),
|
inputId = ns("validate"),
|
||||||
label = htmltools::tagList(
|
label = htmltools::tagList(
|
||||||
phosphoricons::ph("arrow-circle-right", title = i18n$t("Apply changes")),
|
phosphoricons::ph("arrow-circle-right", title = i18n$t("Apply changes"),weight = "bold"),
|
||||||
i18n$t("Apply changes")
|
i18n$t("Apply changes")
|
||||||
),
|
),
|
||||||
width = "100%"
|
width = "100%"
|
||||||
|
|
|
||||||
|
|
@ -275,7 +275,6 @@
|
||||||
"Select a dataset from your environment or sample dataset from a package.","Vælg et datasæt fra din kørende session eller vælg træningsdata."
|
"Select a dataset from your environment or sample dataset from a package.","Vælg et datasæt fra din kørende session eller vælg træningsdata."
|
||||||
"Select a sample dataset from a package.","Vælg et træningsdatasæt."
|
"Select a sample dataset from a package.","Vælg et træningsdatasæt."
|
||||||
"Data ready to be imported!","Data er klar til at blive importeret!"
|
"Data ready to be imported!","Data er klar til at blive importeret!"
|
||||||
"Data has %s obs. of %s variables.","Data har %s obs. på %s variabler."
|
|
||||||
"Data successfully imported!","Data successfully imported!"
|
"Data successfully imported!","Data successfully imported!"
|
||||||
"Click to see data","Klik for at se data"
|
"Click to see data","Klik for at se data"
|
||||||
"No data present.","Ingen data tilstede."
|
"No data present.","Ingen data tilstede."
|
||||||
|
|
@ -320,3 +319,4 @@
|
||||||
"Likert diagram","Likert diagram"
|
"Likert diagram","Likert diagram"
|
||||||
"Modify factor","Modify factor"
|
"Modify factor","Modify factor"
|
||||||
"Create factor/categorical variable from other variables.","Create factor/categorical variable from other variables."
|
"Create factor/categorical variable from other variables.","Create factor/categorical variable from other variables."
|
||||||
|
"The data set has %s obs. in %s variables.","The data set has %s obs. in %s variables."
|
||||||
|
|
|
||||||
|
|
|
@ -275,7 +275,6 @@
|
||||||
"Select a dataset from your environment or sample dataset from a package.","Select a dataset from your environment or sample dataset from a package."
|
"Select a dataset from your environment or sample dataset from a package.","Select a dataset from your environment or sample dataset from a package."
|
||||||
"Select a sample dataset from a package.","Select a sample dataset from a package."
|
"Select a sample dataset from a package.","Select a sample dataset from a package."
|
||||||
"Data ready to be imported!","Data ready to be imported!"
|
"Data ready to be imported!","Data ready to be imported!"
|
||||||
"Data has %s obs. of %s variables.","Data has %s obs. of %s variables."
|
|
||||||
"Data successfully imported!","Data successfully imported!"
|
"Data successfully imported!","Data successfully imported!"
|
||||||
"Click to see data","Click to see data"
|
"Click to see data","Click to see data"
|
||||||
"No data present.","No data present."
|
"No data present.","No data present."
|
||||||
|
|
@ -320,3 +319,4 @@
|
||||||
"Likert diagram","Likert diagram"
|
"Likert diagram","Likert diagram"
|
||||||
"Modify factor","Modify factor"
|
"Modify factor","Modify factor"
|
||||||
"Create factor/categorical variable from other variables.","Create factor/categorical variable from other variables."
|
"Create factor/categorical variable from other variables.","Create factor/categorical variable from other variables."
|
||||||
|
"The data set has %s obs. in %s variables.","The data set has %s obs. in %s variables."
|
||||||
|
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
|
|
||||||
########
|
########
|
||||||
#### Current file: /var/folders/9l/xbc19wxx0g79jdd2sf_0v291mhwh7f/T//RtmpmlTuE8/file8be0207bfdc2.R
|
#### Current file: /var/folders/9l/xbc19wxx0g79jdd2sf_0v291mhwh7f/T//RtmprUCGcI/file47614d090a4c.R
|
||||||
########
|
########
|
||||||
|
|
||||||
i18n_path <- system.file("translations", package = "FreesearchR")
|
i18n_path <- system.file("translations", package = "FreesearchR")
|
||||||
|
|
@ -64,7 +64,7 @@ i18n$set_translation_language("en")
|
||||||
#### Current file: /Users/au301842/FreesearchR/R//app_version.R
|
#### Current file: /Users/au301842/FreesearchR/R//app_version.R
|
||||||
########
|
########
|
||||||
|
|
||||||
app_version <- function()'26.4.1'
|
app_version <- function()'26.4.2'
|
||||||
|
|
||||||
|
|
||||||
########
|
########
|
||||||
|
|
@ -512,7 +512,7 @@ create_column_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("compute"),
|
inputId = ns("compute"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("pencil"), i18n$t("Create column")
|
phosphoricons::ph("pencil",weight = "bold"), i18n$t("Create column")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary",
|
class = "btn-outline-primary",
|
||||||
width = "100%"
|
width = "100%"
|
||||||
|
|
@ -520,7 +520,7 @@ create_column_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("remove"),
|
inputId = ns("remove"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("x-circle"),
|
phosphoricons::ph("x-circle",weight = "bold"),
|
||||||
i18n$t("Cancel")
|
i18n$t("Cancel")
|
||||||
),
|
),
|
||||||
class = "btn-outline-danger",
|
class = "btn-outline-danger",
|
||||||
|
|
@ -1568,7 +1568,7 @@ cut_variable_ui <- function(id) {
|
||||||
toastui::datagridOutput2(outputId = ns("count")),
|
toastui::datagridOutput2(outputId = ns("count")),
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("create"),
|
inputId = ns("create"),
|
||||||
label = tagList(phosphoricons::ph("scissors"), i18n$t("Create factor variable")),
|
label = tagList(phosphoricons::ph("scissors",weight = "bold"), i18n$t("Create factor variable")),
|
||||||
class = "btn-outline-primary float-end"
|
class = "btn-outline-primary float-end"
|
||||||
),
|
),
|
||||||
tags$div(class = "clearfix")
|
tags$div(class = "clearfix")
|
||||||
|
|
@ -2175,7 +2175,7 @@ data_visuals_ui <- function(id, tab_title = "Plots", ...) {
|
||||||
inputId = ns("act_plot"),
|
inputId = ns("act_plot"),
|
||||||
label = i18n$t("Plot"),
|
label = i18n$t("Plot"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("paint-brush"),
|
icon = phosphoricons::ph("paint-brush",weight = "bold"),
|
||||||
# icon = shiny::icon("palette"),
|
# icon = shiny::icon("palette"),
|
||||||
disabled = FALSE
|
disabled = FALSE
|
||||||
),
|
),
|
||||||
|
|
@ -2380,7 +2380,8 @@ data_visuals_server <- function(id,
|
||||||
colorSelectInput(
|
colorSelectInput(
|
||||||
inputId = ns("color_palette"),
|
inputId = ns("color_palette"),
|
||||||
label = i18n$t("Choose color palette"),
|
label = i18n$t("Choose color palette"),
|
||||||
choices = palettes
|
choices = palettes,
|
||||||
|
previews = 5
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -2858,6 +2859,7 @@ wrap_plot_list <- function(data,
|
||||||
guides = "collect",
|
guides = "collect",
|
||||||
axes = "collect",
|
axes = "collect",
|
||||||
axis_titles = "collect",
|
axis_titles = "collect",
|
||||||
|
y.axis.percentage = FALSE,
|
||||||
...) {
|
...) {
|
||||||
if (ggplot2::is_ggplot(data[[1]])) {
|
if (ggplot2::is_ggplot(data[[1]])) {
|
||||||
if (length(data) > 1) {
|
if (length(data) > 1) {
|
||||||
|
|
@ -2871,7 +2873,7 @@ wrap_plot_list <- function(data,
|
||||||
.x
|
.x
|
||||||
}
|
}
|
||||||
})() |>
|
})() |>
|
||||||
align_axes() |>
|
align_axes(percentage=y.axis.percentage) |>
|
||||||
patchwork::wrap_plots(guides = guides,
|
patchwork::wrap_plots(guides = guides,
|
||||||
axes = axes,
|
axes = axes,
|
||||||
axis_titles = axis_titles,
|
axis_titles = axis_titles,
|
||||||
|
|
@ -2916,7 +2918,8 @@ wrap_plot_list <- function(data,
|
||||||
#'
|
#'
|
||||||
align_axes <- function(...,
|
align_axes <- function(...,
|
||||||
x.axis = TRUE,
|
x.axis = TRUE,
|
||||||
y.axis = TRUE) {
|
y.axis = TRUE,
|
||||||
|
percentage = FALSE) {
|
||||||
# https://stackoverflow.com/questions/62818776/get-axis-limits-from-ggplot-object
|
# https://stackoverflow.com/questions/62818776/get-axis-limits-from-ggplot-object
|
||||||
# https://github.com/thomasp85/patchwork/blob/main/R/plot_multipage.R#L150
|
# https://github.com/thomasp85/patchwork/blob/main/R/plot_multipage.R#L150
|
||||||
if (ggplot2::is_ggplot(..1)) {
|
if (ggplot2::is_ggplot(..1)) {
|
||||||
|
|
@ -2934,7 +2937,7 @@ align_axes <- function(...,
|
||||||
xr <- clean_common_axis(p, "x")
|
xr <- clean_common_axis(p, "x")
|
||||||
|
|
||||||
suppressWarnings({
|
suppressWarnings({
|
||||||
purrr::map(p, \(.x) {
|
p_out <- purrr::map(p, \(.x) {
|
||||||
out <- .x
|
out <- .x
|
||||||
if (isTRUE(x.axis)) {
|
if (isTRUE(x.axis)) {
|
||||||
out <- out + ggplot2::xlim(xr)
|
out <- out + ggplot2::xlim(xr)
|
||||||
|
|
@ -2945,6 +2948,15 @@ align_axes <- function(...,
|
||||||
out
|
out
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if(isTRUE(percentage)){
|
||||||
|
lapply(p_out,\(.x){
|
||||||
|
.x+
|
||||||
|
ggplot2::scale_y_continuous(labels = scales::percent)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
p_out
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#' Extract and clean axis ranges
|
#' Extract and clean axis ranges
|
||||||
|
|
@ -4031,13 +4043,13 @@ color_choices <- function() {
|
||||||
"Perceptual (blue-yellow)" = "viridis",
|
"Perceptual (blue-yellow)" = "viridis",
|
||||||
"Perceptual (fire)" = "plasma",
|
"Perceptual (fire)" = "plasma",
|
||||||
"Colour-blind friendly" = "Okabe-Ito",
|
"Colour-blind friendly" = "Okabe-Ito",
|
||||||
"Qualitative (bold)" = "Dark 2",
|
"Diverging (red-yellow-green)"= "RdYlGn",
|
||||||
"Qualitative (paired)" = "Paired",
|
|
||||||
"Sequential (blues)" = "Blues",
|
|
||||||
"Diverging (red-blue)" = "RdBu",
|
"Diverging (red-blue)" = "RdBu",
|
||||||
"Tableau style" = "Tableau 10",
|
"Sequential (blues)" = "Blues",
|
||||||
"Pastel" = "Pastel 1",
|
"Qualitative (paired)" = "Paired",
|
||||||
"Rainbow" = "rainbow"
|
"Qualitative (bold)" = "Dark 2",
|
||||||
|
"Rainbow" = "Spectral",
|
||||||
|
"Generic" = "Set1"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4945,7 +4957,7 @@ apply_idea_filter <- function(filtered_reactive, df_target, env = parent.frame()
|
||||||
#### Current file: /Users/au301842/FreesearchR/R//hosted_version.R
|
#### Current file: /Users/au301842/FreesearchR/R//hosted_version.R
|
||||||
########
|
########
|
||||||
|
|
||||||
hosted_version <- function()'v26.4.1-260402'
|
hosted_version <- function()'v26.4.2-260410'
|
||||||
|
|
||||||
|
|
||||||
########
|
########
|
||||||
|
|
@ -6085,7 +6097,7 @@ make_success_alert <- function(data,
|
||||||
i18n$t("Data ready to be imported!")
|
i18n$t("Data ready to be imported!")
|
||||||
),
|
),
|
||||||
sprintf(
|
sprintf(
|
||||||
i18n$t("Data has %s obs. of %s variables."),
|
i18n$t("The data set has %s obs. in %s variables."),
|
||||||
nrow(data),
|
nrow(data),
|
||||||
ncol(data)
|
ncol(data)
|
||||||
),
|
),
|
||||||
|
|
@ -6096,7 +6108,7 @@ make_success_alert <- function(data,
|
||||||
i18n$t("Data successfully imported!")
|
i18n$t("Data successfully imported!")
|
||||||
),
|
),
|
||||||
sprintf(
|
sprintf(
|
||||||
i18n$t("Data has %s obs. of %s variables."),
|
i18n$t("The data set has %s obs. in %s variables."),
|
||||||
nrow(data),
|
nrow(data),
|
||||||
ncol(data)
|
ncol(data)
|
||||||
),
|
),
|
||||||
|
|
@ -6581,7 +6593,7 @@ data_missings_ui <- function(id, ...) {
|
||||||
inputId = ns("act_miss"),
|
inputId = ns("act_miss"),
|
||||||
label = i18n$t("Evaluate"),
|
label = i18n$t("Evaluate"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("calculator"),
|
icon = phosphoricons::ph("calculator",weight = "bold"),
|
||||||
# icon = shiny::icon("calculator"),
|
# icon = shiny::icon("calculator"),
|
||||||
disabled = TRUE
|
disabled = TRUE
|
||||||
)
|
)
|
||||||
|
|
@ -6918,8 +6930,32 @@ missings_logic_across <- function(data, exclude = NULL) {
|
||||||
#### Current file: /Users/au301842/FreesearchR/R//plot_bar.R
|
#### Current file: /Users/au301842/FreesearchR/R//plot_bar.R
|
||||||
########
|
########
|
||||||
|
|
||||||
plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fill"),
|
#' Title
|
||||||
color.palette = "viridis", max_level = 30, ...) {
|
#'
|
||||||
|
#' @name data-plots
|
||||||
|
#'
|
||||||
|
#' @param style barplot style passed to geom_bar position argument.
|
||||||
|
#' One of c("stack", "dodge", "fill")
|
||||||
|
#'
|
||||||
|
#' @returns ggplot list object
|
||||||
|
#' @export
|
||||||
|
#'
|
||||||
|
#' @examples
|
||||||
|
#' mtcars |>
|
||||||
|
#' dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
||||||
|
#' plot_bar(pri = "cyl", sec = "am", style = "fill")
|
||||||
|
#'
|
||||||
|
#' mtcars |>
|
||||||
|
#' dplyr::mutate(dplyr::across(tidyselect::all_of(c("cyl","am","gear")),factor)) |>
|
||||||
|
#' plot_bar(pri = "cyl", sec = "gear", ter = "am", style = "stack",color.palette="turbo")
|
||||||
|
plot_bar <- function(data,
|
||||||
|
pri,
|
||||||
|
sec = NULL,
|
||||||
|
ter = NULL,
|
||||||
|
style = c("stack", "dodge", "fill"),
|
||||||
|
color.palette = "viridis",
|
||||||
|
max_level = 30,
|
||||||
|
...) {
|
||||||
style <- match.arg(style)
|
style <- match.arg(style)
|
||||||
|
|
||||||
if (!is.null(ter)) {
|
if (!is.null(ter)) {
|
||||||
|
|
@ -6928,7 +6964,7 @@ plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fi
|
||||||
ds <- list(data)
|
ds <- list(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
out <- lapply(ds, \(.ds){
|
out <- lapply(ds, \(.ds) {
|
||||||
plot_bar_single(
|
plot_bar_single(
|
||||||
data = .ds,
|
data = .ds,
|
||||||
pri = pri,
|
pri = pri,
|
||||||
|
|
@ -6939,7 +6975,10 @@ plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fi
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
wrap_plot_list(out, title = glue::glue(i18n$t("Grouped by {get_label(data,ter)}")), ...)
|
wrap_plot_list(out,
|
||||||
|
title = glue::glue(i18n$t("Grouped by {get_label(data,ter)}")),
|
||||||
|
y.axis.percentage = TRUE,
|
||||||
|
...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -6961,7 +7000,11 @@ plot_bar <- function(data, pri, sec, ter = NULL, style = c("stack", "dodge", "fi
|
||||||
#' mtcars |>
|
#' mtcars |>
|
||||||
#' dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
#' dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
||||||
#' plot_bar_single(pri = "cyl", style = "stack",color.palette="turbo")
|
#' plot_bar_single(pri = "cyl", style = "stack",color.palette="turbo")
|
||||||
plot_bar_single <- function(data, pri, sec = NULL, style = c("stack", "dodge", "fill"), max_level = 30,
|
plot_bar_single <- function(data,
|
||||||
|
pri,
|
||||||
|
sec = NULL,
|
||||||
|
style = c("stack", "dodge", "fill"),
|
||||||
|
max_level = 30,
|
||||||
color.palette = "viridis") {
|
color.palette = "viridis") {
|
||||||
style <- match.arg(style)
|
style <- match.arg(style)
|
||||||
|
|
||||||
|
|
@ -6971,16 +7014,11 @@ plot_bar_single <- function(data, pri, sec = NULL, style = c("stack", "dodge", "
|
||||||
|
|
||||||
p_data <- as.data.frame(table(data[c(pri, sec)])) |>
|
p_data <- as.data.frame(table(data[c(pri, sec)])) |>
|
||||||
dplyr::mutate(dplyr::across(tidyselect::any_of(c(pri, sec)), forcats::as_factor),
|
dplyr::mutate(dplyr::across(tidyselect::any_of(c(pri, sec)), forcats::as_factor),
|
||||||
p = Freq / NROW(data)
|
p = Freq / NROW(data))
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if (nrow(p_data) > max_level) {
|
if (nrow(p_data) > max_level) {
|
||||||
p_data <- sort_by(
|
p_data <- sort_by(p_data, p_data[["Freq"]], decreasing = TRUE) |>
|
||||||
p_data,
|
|
||||||
p_data[["Freq"]],
|
|
||||||
decreasing = TRUE
|
|
||||||
) |>
|
|
||||||
head(max_level)
|
head(max_level)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6993,41 +7031,33 @@ plot_bar_single <- function(data, pri, sec = NULL, style = c("stack", "dodge", "
|
||||||
fill <- pri
|
fill <- pri
|
||||||
}
|
}
|
||||||
|
|
||||||
p <- ggplot2::ggplot(
|
p <- ggplot2::ggplot(p_data, ggplot2::aes(x = .data[[pri]], y = p, fill = .data[[fill]])) +
|
||||||
p_data,
|
|
||||||
ggplot2::aes(
|
|
||||||
x = .data[[pri]],
|
|
||||||
y = p,
|
|
||||||
fill = .data[[fill]]
|
|
||||||
)
|
|
||||||
) +
|
|
||||||
ggplot2::geom_bar(position = style, stat = "identity") +
|
ggplot2::geom_bar(position = style, stat = "identity") +
|
||||||
ggplot2::scale_y_continuous(labels = scales::percent) +
|
scale_fill_generate(palette = color.palette) +
|
||||||
scale_fill_generate(palette=color.palette) +
|
ggplot2::xlab(get_label(data, pri)) +
|
||||||
ggplot2::ylab("Percentage") +
|
ggplot2::guides(fill = ggplot2::guide_legend(title = get_label(data, fill)))
|
||||||
ggplot2::xlab(get_label(data,pri))+
|
|
||||||
ggplot2::guides(fill = ggplot2::guide_legend(title = get_label(data,fill)))
|
|
||||||
|
|
||||||
## To handle large number of levels and long level names
|
## To handle large number of levels and long level names
|
||||||
|
|
||||||
if (nrow(p_data) > 10 | any(nchar(as.character(p_data[[pri]])) > 6)) {
|
if (nrow(p_data) > 10 |
|
||||||
|
any(nchar(as.character(p_data[[pri]])) > 6)) {
|
||||||
p <- p +
|
p <- p +
|
||||||
# ggplot2::guides(fill = "none") +
|
# ggplot2::guides(fill = "none") +
|
||||||
ggplot2::theme(
|
ggplot2::theme(axis.text.x = ggplot2::element_text(
|
||||||
axis.text.x = ggplot2::element_text(
|
angle = 90,
|
||||||
angle = 90,
|
vjust = 1,
|
||||||
vjust = 1, hjust = 1
|
hjust = 1
|
||||||
))+
|
)) +
|
||||||
ggplot2::theme(
|
ggplot2::theme(axis.text.x = ggplot2::element_text(vjust = 0.5))
|
||||||
axis.text.x = ggplot2::element_text(vjust = 0.5)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (is.null(sec)){
|
if (is.null(sec)) {
|
||||||
p <- p +
|
p <- p +
|
||||||
ggplot2::guides(fill = "none")
|
ggplot2::guides(fill = "none")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p
|
p +
|
||||||
|
ggplot2::scale_y_continuous(labels = scales::percent) +
|
||||||
|
ggplot2::ylab("Percentage")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -10965,7 +10995,7 @@ string_split_ui <- function(id) {
|
||||||
),
|
),
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("create"),
|
inputId = ns("create"),
|
||||||
label = tagList(phosphoricons::ph("pencil"), i18n$t("Apply split")),
|
label = tagList(phosphoricons::ph("pencil",weight = "bold"), i18n$t("Apply split")),
|
||||||
class = "btn-outline-primary float-end"
|
class = "btn-outline-primary float-end"
|
||||||
),
|
),
|
||||||
tags$div(class = "clearfix")
|
tags$div(class = "clearfix")
|
||||||
|
|
@ -11850,7 +11880,7 @@ ui_elements <- function(selection) {
|
||||||
inputId = "modal_initial_view",
|
inputId = "modal_initial_view",
|
||||||
label = i18n$t("Quick overview"),
|
label = i18n$t("Quick overview"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("binoculars"),
|
icon = phosphoricons::ph("binoculars",weight = "bold"),
|
||||||
# icon = shiny::icon("binoculars"),
|
# icon = shiny::icon("binoculars"),
|
||||||
disabled = FALSE
|
disabled = FALSE
|
||||||
),
|
),
|
||||||
|
|
@ -11895,7 +11925,7 @@ ui_elements <- function(selection) {
|
||||||
inputId = "act_start",
|
inputId = "act_start",
|
||||||
label = i18n$t("Let's begin!"),
|
label = i18n$t("Let's begin!"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("play"),
|
icon = phosphoricons::ph("play",weight = "bold"),
|
||||||
# icon = shiny::icon("play"),
|
# icon = shiny::icon("play"),
|
||||||
disabled = TRUE
|
disabled = TRUE
|
||||||
),
|
),
|
||||||
|
|
@ -12186,7 +12216,7 @@ ui_elements <- function(selection) {
|
||||||
inputId = "act_eval",
|
inputId = "act_eval",
|
||||||
label = i18n$t("Evaluate"),
|
label = i18n$t("Evaluate"),
|
||||||
width = "100%",
|
width = "100%",
|
||||||
icon = phosphoricons::ph("calculator"),
|
icon = phosphoricons::ph("calculator",weight = "bold"),
|
||||||
# icon = shiny::icon("calculator"),
|
# icon = shiny::icon("calculator"),
|
||||||
disabled = TRUE
|
disabled = TRUE
|
||||||
),
|
),
|
||||||
|
|
@ -12497,7 +12527,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
disabled = TRUE,
|
disabled = TRUE,
|
||||||
inputId = ns("drop_levels"),
|
inputId = ns("drop_levels"),
|
||||||
label = tagList(phosphoricons::ph("trash"), i18n$t("Drop empty")),
|
label = tagList(phosphoricons::ph("trash",weight = "bold"), i18n$t("Drop empty")),
|
||||||
class = "btn-outline-primary mb-3",
|
class = "btn-outline-primary mb-3",
|
||||||
width = "100%"
|
width = "100%"
|
||||||
)
|
)
|
||||||
|
|
@ -12508,7 +12538,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("sort_levels"),
|
inputId = ns("sort_levels"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("sort-ascending"),
|
phosphoricons::ph("sort-ascending",weight = "bold"),
|
||||||
i18n$t("Sort by levels")
|
i18n$t("Sort by levels")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary mb-3",
|
class = "btn-outline-primary mb-3",
|
||||||
|
|
@ -12521,7 +12551,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("sort_occurrences"),
|
inputId = ns("sort_occurrences"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("sort-ascending"),
|
phosphoricons::ph("sort-ascending",weight = "bold"),
|
||||||
i18n$t("Sort by count")
|
i18n$t("Sort by count")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary mb-3",
|
class = "btn-outline-primary mb-3",
|
||||||
|
|
@ -12545,7 +12575,7 @@ update_factor_ui <- function(id) {
|
||||||
actionButton(
|
actionButton(
|
||||||
inputId = ns("create"),
|
inputId = ns("create"),
|
||||||
label = tagList(
|
label = tagList(
|
||||||
phosphoricons::ph("arrow-clockwise"),
|
phosphoricons::ph("arrow-clockwise",weight = "bold"),
|
||||||
i18n$t("Update factor variable")
|
i18n$t("Update factor variable")
|
||||||
),
|
),
|
||||||
class = "btn-outline-primary"
|
class = "btn-outline-primary"
|
||||||
|
|
@ -12897,7 +12927,7 @@ update_variables_ui <- function(id, title = "") {
|
||||||
placement = "bottom-end",
|
placement = "bottom-end",
|
||||||
shiny::actionButton(
|
shiny::actionButton(
|
||||||
inputId = ns("settings"),
|
inputId = ns("settings"),
|
||||||
label = phosphoricons::ph("gear"),
|
label = phosphoricons::ph("gear",weight = "bold"),
|
||||||
class = "pull-right float-right"
|
class = "pull-right float-right"
|
||||||
),
|
),
|
||||||
shinyWidgets::textInputIcon(
|
shinyWidgets::textInputIcon(
|
||||||
|
|
@ -12942,7 +12972,7 @@ update_variables_ui <- function(id, title = "") {
|
||||||
shiny::actionButton(
|
shiny::actionButton(
|
||||||
inputId = ns("validate"),
|
inputId = ns("validate"),
|
||||||
label = htmltools::tagList(
|
label = htmltools::tagList(
|
||||||
phosphoricons::ph("arrow-circle-right", title = i18n$t("Apply changes")),
|
phosphoricons::ph("arrow-circle-right", title = i18n$t("Apply changes"),weight = "bold"),
|
||||||
i18n$t("Apply changes")
|
i18n$t("Apply changes")
|
||||||
),
|
),
|
||||||
width = "100%"
|
width = "100%"
|
||||||
|
|
|
||||||
|
|
@ -275,7 +275,6 @@
|
||||||
"Select a dataset from your environment or sample dataset from a package.","Vælg et datasæt fra din kørende session eller vælg træningsdata."
|
"Select a dataset from your environment or sample dataset from a package.","Vælg et datasæt fra din kørende session eller vælg træningsdata."
|
||||||
"Select a sample dataset from a package.","Vælg et træningsdatasæt."
|
"Select a sample dataset from a package.","Vælg et træningsdatasæt."
|
||||||
"Data ready to be imported!","Data er klar til at blive importeret!"
|
"Data ready to be imported!","Data er klar til at blive importeret!"
|
||||||
"Data has %s obs. of %s variables.","Data har %s obs. på %s variabler."
|
|
||||||
"Data successfully imported!","Data successfully imported!"
|
"Data successfully imported!","Data successfully imported!"
|
||||||
"Click to see data","Klik for at se data"
|
"Click to see data","Klik for at se data"
|
||||||
"No data present.","Ingen data tilstede."
|
"No data present.","Ingen data tilstede."
|
||||||
|
|
@ -320,3 +319,4 @@
|
||||||
"Likert diagram","Likert diagram"
|
"Likert diagram","Likert diagram"
|
||||||
"Modify factor","Modify factor"
|
"Modify factor","Modify factor"
|
||||||
"Create factor/categorical variable from other variables.","Create factor/categorical variable from other variables."
|
"Create factor/categorical variable from other variables.","Create factor/categorical variable from other variables."
|
||||||
|
"The data set has %s obs. in %s variables.","The data set has %s obs. in %s variables."
|
||||||
|
|
|
||||||
|
|
|
@ -275,7 +275,6 @@
|
||||||
"Select a dataset from your environment or sample dataset from a package.","Select a dataset from your environment or sample dataset from a package."
|
"Select a dataset from your environment or sample dataset from a package.","Select a dataset from your environment or sample dataset from a package."
|
||||||
"Select a sample dataset from a package.","Select a sample dataset from a package."
|
"Select a sample dataset from a package.","Select a sample dataset from a package."
|
||||||
"Data ready to be imported!","Data ready to be imported!"
|
"Data ready to be imported!","Data ready to be imported!"
|
||||||
"Data has %s obs. of %s variables.","Data has %s obs. of %s variables."
|
|
||||||
"Data successfully imported!","Data successfully imported!"
|
"Data successfully imported!","Data successfully imported!"
|
||||||
"Click to see data","Click to see data"
|
"Click to see data","Click to see data"
|
||||||
"No data present.","No data present."
|
"No data present.","No data present."
|
||||||
|
|
@ -320,3 +319,4 @@
|
||||||
"Likert diagram","Likert diagram"
|
"Likert diagram","Likert diagram"
|
||||||
"Modify factor","Modify factor"
|
"Modify factor","Modify factor"
|
||||||
"Create factor/categorical variable from other variables.","Create factor/categorical variable from other variables."
|
"Create factor/categorical variable from other variables.","Create factor/categorical variable from other variables."
|
||||||
|
"The data set has %s obs. in %s variables.","The data set has %s obs. in %s variables."
|
||||||
|
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
\alias{align_axes}
|
\alias{align_axes}
|
||||||
\title{Aligns axes between plots}
|
\title{Aligns axes between plots}
|
||||||
\usage{
|
\usage{
|
||||||
align_axes(..., x.axis = TRUE, y.axis = TRUE)
|
align_axes(..., x.axis = TRUE, y.axis = TRUE, percentage = FALSE)
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
\item{...}{ggplot2 objects or list of ggplot2 objects}
|
\item{...}{ggplot2 objects or list of ggplot2 objects}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
\alias{data_visuals_ui}
|
\alias{data_visuals_ui}
|
||||||
\alias{data_visuals_server}
|
\alias{data_visuals_server}
|
||||||
\alias{create_plot}
|
\alias{create_plot}
|
||||||
|
\alias{plot_bar}
|
||||||
\alias{plot_bar_single}
|
\alias{plot_bar_single}
|
||||||
\alias{plot_box}
|
\alias{plot_box}
|
||||||
\alias{plot_box_single}
|
\alias{plot_box_single}
|
||||||
|
|
@ -25,6 +26,17 @@ data_visuals_server(id, data, palettes, ...)
|
||||||
|
|
||||||
create_plot(data, type, pri, sec, ter = NULL, color.palette = "viridis", ...)
|
create_plot(data, type, pri, sec, ter = NULL, color.palette = "viridis", ...)
|
||||||
|
|
||||||
|
plot_bar(
|
||||||
|
data,
|
||||||
|
pri,
|
||||||
|
sec = NULL,
|
||||||
|
ter = NULL,
|
||||||
|
style = c("stack", "dodge", "fill"),
|
||||||
|
color.palette = "viridis",
|
||||||
|
max_level = 30,
|
||||||
|
...
|
||||||
|
)
|
||||||
|
|
||||||
plot_bar_single(
|
plot_bar_single(
|
||||||
data,
|
data,
|
||||||
pri,
|
pri,
|
||||||
|
|
@ -91,6 +103,8 @@ shiny server module
|
||||||
|
|
||||||
ggplot2 object
|
ggplot2 object
|
||||||
|
|
||||||
|
ggplot list object
|
||||||
|
|
||||||
ggplot object
|
ggplot object
|
||||||
|
|
||||||
ggplot2 object
|
ggplot2 object
|
||||||
|
|
@ -116,6 +130,8 @@ Data correlations evaluation module
|
||||||
|
|
||||||
Wrapper to create plot based on provided type
|
Wrapper to create plot based on provided type
|
||||||
|
|
||||||
|
Title
|
||||||
|
|
||||||
Single vertical barplot
|
Single vertical barplot
|
||||||
|
|
||||||
Beautiful box plot(s)
|
Beautiful box plot(s)
|
||||||
|
|
@ -138,6 +154,13 @@ Beautiful violin plot
|
||||||
}
|
}
|
||||||
\examples{
|
\examples{
|
||||||
create_plot(mtcars, "plot_violin", "mpg", "cyl") |> attributes()
|
create_plot(mtcars, "plot_violin", "mpg", "cyl") |> attributes()
|
||||||
|
mtcars |>
|
||||||
|
dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
||||||
|
plot_bar(pri = "cyl", sec = "am", style = "fill")
|
||||||
|
|
||||||
|
mtcars |>
|
||||||
|
dplyr::mutate(dplyr::across(tidyselect::all_of(c("cyl","am","gear")),factor)) |>
|
||||||
|
plot_bar(pri = "cyl", sec = "gear", ter = "am", style = "stack",color.palette="turbo")
|
||||||
mtcars |>
|
mtcars |>
|
||||||
dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
dplyr::mutate(cyl = factor(cyl), am = factor(am)) |>
|
||||||
plot_bar_single(pri = "cyl", sec = "am", style = "fill")
|
plot_bar_single(pri = "cyl", sec = "am", style = "fill")
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ wrap_plot_list(
|
||||||
guides = "collect",
|
guides = "collect",
|
||||||
axes = "collect",
|
axes = "collect",
|
||||||
axis_titles = "collect",
|
axis_titles = "collect",
|
||||||
|
y.axis.percentage = FALSE,
|
||||||
...
|
...
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue