Changelog
Source:NEWS.md
saros 1.6.0
Breaking Changes
-
Major change:
makeme()returns an empty data.frame instead ofNULLwhen no plot or table can be created, simplifying downstream code (e.g.gt::gt()fails if servedNULL) -
Major change: Resolved issue #372 -
descendparameter now works correctly with ordered factors while preserving their inherent level ordering. Ordered factors maintain their natural order as the base, butdescendcan reverse the display order
New Features
-
New output type:
makeme(type = "int_plot_html")for interactive interval plots with violin and box plots - Added support for
data_label = "mean"anddata_label = "median"inmakeme()fortype = "cat_*_html"outputs (addresses issue #460) - Added
data_label_positionargument tomakeme()allowing data labels to be positioned at “center”, “bottom”, “top”, or “above” bars in categorical plots (addresses issue #365) - Enhanced
chr_table_htmlto support multiple independent variables for displaying background context with open-ended text responses
Sorting Improvements
- Independent-variable ordering is now computed per dependent variable, allowing indep order to vary per dep;
descend_indepnow consistently reverses indep order across tables and plots; plots use centralized.indep_orderwhen indep is on the x-axis; ordered indep factors take precedence oversort_indep_by(reversed only whendescend_indep=TRUE); legends preserve unused response levels in.category - Implemented B1 strategy for direct column-based sorting via whitelists. Allowed keys for dependent variables are now centrally defined and enforced; independent variables use a similar whitelist (including
.count_total_indep). This prevents accidental sorting on arbitrary or missing columns and clarifies supported behavior -
sort_indep_bynow explicitly defaults to".factor_order"and acceptsNULL(treated as".factor_order"). When no independent variable is provided (indep = NULL), specifyingsort_indep_byordescend_indepno longer errors; they are simply ignored - Improved sorting stability for dependent variables with missing/duplicate labels — internal joins for computing
.dep_ordernow key by.variable_name(unique) instead of.variable_label, preventing many-to-one join errors in edge cases while preserving displayed labels
Critical Fixes
-
CRITICAL: Resolved bug in
makeme()where combinations of valid factor variables with all-NA factor variables incorrectly threw “mix of categorical and continuous variables” error. Variable type checking now uses filtered variable lists instead of original lists, preventing premature type validation errors -
CRAN Compliance: Reduced string lengths in documentation for
girafe()andmakeme()functions to meet CRAN’s character limit per line requirement
Bug Fixes
- Resolved faceting issue in
int_plot_htmlwherelabel_separator = NULLwith independent variables caused violin/boxplot and label geoms to appear in separate facets due to inconsistent string wrapping - Removed unnecessary “multiple main questions” warning when using
label_separator = NULL, as having different main questions is expected behavior - Resolved issue #464 -
makeme()failures for sigtest_table when dep and indep variables overlap. Now automatically excludes indep variables from dep selection to prevent conflicts - Corrected double NA check logic in
check_bool()function - removed redundant condition that made validation always pass for NA values - Improved NULL and NA handling in
glue_together_range()to prevent edge case failures with empty or invalid data ranges - Improved robustness of
check_no_duplicated_label_suffix()to handle empty data frames and missing columns gracefully - Enhanced
check_sort_by()validation to properly handle empty character vectors with clear error messages - Improved
keep_subitem()to handle character inputs and use factor levels for better NA handling - Simplified
arrange_table_data()sorting logic for better reliability - Updated documentation reference from
ggplot2::theme_set()toggplot2::set_theme()due to ggplot2 4.0.0
Enhancements
-
PERFORMANCE: Optimized
makeme()examples for 73.8% faster execution (6.6s → 1.7s total). Reduced variable counts and crowd configurations while maintaining educational value - Updated
fig_height_h_barchart2()example for consistency with optimized examples - Completely rewrote the
.spreadalgorithm insubset_vector()for better spread maximization using evenly spaced positions - Added
.onUnload()function to clean up global options when package is unloaded, preventing option pollution in user’s R session
Internal Refactoring
- Substantially modularized internal implementation of
makeme()into focused helper functions (argument setup, crowd processing, output assembly, validation). Improves readability, testability, and robustness without changing public API (closes #368) - Split
post_process_makeme_data()into focused single-responsibility functions:process_indep_factor_levels()for general factor reversal andprocess_binary_category_colors()for cat_plot_html-specific binary category processing - Modularized tabular I/O functionality - renamed
pretty_tabular.Rtotabular_write.Rand extractedtabular_read()function into separate file - Centralized global constants (sorting whitelists) in
zzz.Runder.saros.envfor easier maintenance - Using
airfor consistent code formatting
Development & Testing
- Added comprehensive test coverage for
makeme()helper functions with full roxygen2 documentation and @keywords internal annotation for internal API clarity - Added comprehensive visual regression testing for
int_plot_htmlusing vdiffr snapshot tests covering various scenarios - Added comprehensive test coverage for utility validation functions
- Added comprehensive unit tests for
makeme()variable type checking edge cases including all-NA variables - Added VS Code configuration for improved development experience
- Added
surveypackage to Suggests for enhanced testing capabilities - Updated build ignore patterns for coverage reports and library files
saros 1.5.3
CRAN release: 2025-06-02
- Fix:
makemenow handles arguments in parent frame scopes correctly. - Fix: internal function
get_common_levelsnow works with no providedcol_pos.
saros 1.5.1
CRAN release: 2025-02-12
- Feature: Added
".percentage"as valid (sorting) column - Feature:
cat_table_htmlreturns NULL if nothing to display - Fix:
scale_x_reorderednow only sorts when needed - Fix:
cat_table_htmltakes showNA properly - Minor: refactoring of
cat_plot_html
saros 1.5.0
CRAN release: 2025-01-10
Major changes
- Lots of settings for
makeme()useful for creating plots comparing a group with all other groups combined, or everyone. -
fig_height_h_barchart()finally works adequately for 90 percent of figure combinations. - Global settings inheritance for
makeme(),make_link(),girafe(),n_range(),n_range2() - New function
makeme(type="int_plot_html")for violin plots
saros 1.2.0
CRAN release: 2024-09-03
Major changes
-
embed_*-functions are replaced bymakeme(type="cat_plot")etc-
makeme()takes S3-methods which eases expansions. -
embed_*are thus lifecycle soft-deprecated.
-
New features
-
n_range()gives the n_range for a given dataset, dependent and independent variables. -
n_range2()same asn_range()but takes amakeme()-object for convenience. -
make_link()for generating downloadable figures, tables, data or anything else, on the spot. -
ggsaver()is a minor wrapper to ease using make_link with ggplot2::ggsave(). -
fig_height_h_barchart()estimates the optimal figure height for a horizontal barchart. -
fig_height_h_barchart2()same as above, but takes a makeme()-object for convenience. -
makeme(type="cat_plot_html")allows sorting within each dependent variable-by-independent variable (facet-sort)
saros 1.1.0
-feat: Removed colour_palette (#328) -fix: Argument chapter_qmd_start_section_filepath now has effect. (#321) -fix: simplified create_email_credentials() (#305) -fix: pkgdown for recode_checkbox_sets (#304) -fix: cat_*_plot now displays keys for unused categories in legend (#301) -fix: single_y_bivariates_if_deps_above() no longer affects univariates (#300) -fix: More robust estimate_plot_height if dep only has one NA category (#299) -fix: Significance test now works in edge cases (#297) -feat: chr_table now ignores NA and empty strings. (#296) -fix: serialized_format now actually supports qs, if installed. (#293) -feat: Added default to replace_heading_for_group (#291) -feat: Removed flexi-app (#289) -feat: Removed unnecessary rendering-assistance tools. (#287) -feat: gen_qmd_index has now been refactored (#286) - simplified to gen_qmd_file, which better handles index and report - Also allows separate qmd_snippets at start and end for index and - Extract formats from report_header_yaml which is used to create links -fix: insert_obj_in_qmd now uses conv_to_valid_obj_name() again (#284) -feat: Removed saving png files as it is rarely used. (#283) -fix: crosstable3() now handles character vectors. (#278)
saros 1.0.3
- Added more arguments for plot text sizes, with more useful defaults for Word and HTML layouts.
-
attach_qualtrics_labelsis now more flexible. - Minor fix in
sanitize_labels. - Internal change to accommodate ggplot2 3.5.0.
- Improved performance for argument validation checks.
-
setup_access_restrictionsnow accepts NULL password input. -
setup_access_restrictionsnow can warn instead of error ifrel_parent_pathdoes not exist. -
sort_bynow correctly sorts withdescend=TRUEfor “.upper”, etc. - Fixed
list_available_element_types - Set one long-running test for
draft_reportto only run on maintainer’s local computer. -
sanitize_labelsnow has option to translate ASCII HTML-escaped characters to unicode.