Releases: NIFU-NO/saros
Releases · NIFU-NO/saros
Release list
saros 1.6.0
Breaking Changes
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)- 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 - Enhanced
custom_palette()to allowpriority_palette_codesto supplement base palette when insufficient colors are available - Improved color palette handling for explicit NA factor levels when using
showNA = "always"
New Features
New Functions and Output Types
- New output type:
makeme(type = "int_plot_html")for interactive interval plots with violin and box plots - New function:
txt_from_cat_mesos_plots()to generate textual summaries from two categorical mesos-scale plots, highlighting significant differences in selected categories between groups. Supports global settings viaglobal_settings_set()(closes #506) - New function:
crowd_plots_as_tabset()to convert a list of ggplot2 objects (typically frommakeme(crowd = ...)) into Quarto tabsets with automatic height calculation and optional download links. Supports both categorical and interval plots with intelligent auto-detection based on plot layers - New exported function:
get_fig_title_suffix_from_ggplot()generates figure title suffixes with N range and optional download links for plots
Enhanced Functionality
- 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 - Added
na_colourparameter tohex_bw()function to allow customization of text color for NA fills (default: "#ffffff") - Added
colour_2nd_binary_catparameter togirafe()for checkbox plots - when set withchecked/not_checked, reverses category order so the second category receives the specified color
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
Bug Fixes & Improvements
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 - 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
Robustness Improvements
- Added vector length validation in
get_fig_title_suffix_from_ggplot()to prevent subscript-out-of-bounds errors when vectorized parameters have mismatched lengths n_rng2()now gracefully handles plots not created bymakeme()by calculating N from complete cases instead of aborting, and properly handles all-NA and empty.count_per_indep_groupvalues by returning "0" with clear warnings instead of producing infinite valuescrowd_plots_as_tabset()now validates each plot individually in the loop, preventing invalid objects from causing failures- Improved empty data frame handling throughout - using
is.data.frame()andnrow()checks instead oflength()for more reliable validation
Other 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 - 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 - Fixed
custom_palette()ingirafe()to properly handle unnamed elements inpriority_palette_codesas colors for "NA" category. Previously, unnamed elements were filtered out, causing NA categories to receive no color assignment (appearing as white fill with white text)
Performance Enhancements
- 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
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 - Moved
process_binary_category_colors()logic frommake_content.cat_plot_html()togirafe(), consolidating all color-related logic in one place - Refactored checkbox plot handling in
girafe()to integratecolour_2nd_binary_catparameter withconvert_to_checkbox_plot()function - 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 - Extracted duplicate label wrapping logic into
apply_label_wrapping()helper function, improving maintainability and consistency - Added explicit return statement in
make_content.int_plot_html()for clarity - Added
.onUnload()function to clean up global options when package is unloaded, preventing option pollution in user's R session - Using
airfor consistent code formatting - CRAN Compliance: Reduced string lengths in documentation for
girafe()andmakeme()functions to meet CRAN's character limit per line requirement
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 and edge cases including all-NA variables
- Added test coverage for global settings support in
txt_from_cat_mesos_plots()with proper cleanup usingwithr::defer() - 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
- Fix:
makemenow handles arguments in parent frame scopes correctly.
saros 1.5.0
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
Minor changes
makeme(type="cat_plot_html")no longer shows a line one the y axis for single variable plots.- Refactored
crosstable.data.frame()andcrosstable.survey()methods. - Many more tests.
- Countless bugfixes.
saros 1.2.0
Major changes
embed_*-functions are replaced bymakeme(type="cat_plot")etcmakeme()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.cat_plot()allows sorting within each dependent variable-by-independent variable (facet-sort)
Bugfixes
- Too many to list, but see saros 1.1.0 for some of them.
saros 1.0.4
- 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.