--- title: "Developer Guide: sprtt Package" author: "Meike Snijder-Steinhilber" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Developer Guide: sprtt Package} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = FALSE ) ``` ## Overview This vignette provides technical documentation for developers who want to maintain, extend, or contribute to the `sprtt` package. It explains the internal architecture, code organization, computational methods, and development workflows. **Target audience**: R package developers, future maintainers, and contributors **Prerequisite knowledge**: - R package development basics - S4 object-oriented programming - Statistical knowledge of Sequential Probability Ratio Tests, see `vignette("sprt")` ## Package Architecture ### Overview The `sprtt` package follows a modular architecture with clear separation of concerns: 1. **Main User-facing functions** (`seq_ttest()`, `seq_anova()`) handle input validation and provide clean interfaces 5. **Utility User-facing functions** provide supporting functionality (plotting, data generation, caching) 2. **Builder functions** (`build_seq_*_arguments()`) Transform and validate user inputs into a structured S4 argument object. Builder functions act as a processing pipeline between the user-facing interface and the core calculation functions. They handle the complex task of parsing different input formats, validating all parameters, and packaging everything into a type-safe container. 3. **Calculation functions** (`calc_seq_*()`) perform the core computations 4. **Internal utility functions** (e.g., `delete_na()`, `extract_formula()`, `get_seq_decision()`, ...) are small, focused helpers that handle specific tasks across the package. They follow the Single Responsibility Principle - each function does one thing well. This design reduces code duplication, improves testability, and makes the codebase easier to maintain. 5. **Result Classes** - S4 classes that store results in type-safe, structured containers. These classes provide controlled access to result components through standardized methods (`@`, `[]`, and `show()`), ensuring consistency and extensibility. This separation allows for: - Easy testing of individual components - Clear error handling at appropriate levels - Extensibility for future sequential tests - Consistent user experience across functions **Function Naming Convention:** - `seq_*()`: User-facing main functions - `build_*()`: Argument preparation functions - `calc_*()`: Computational core functions - `*_class.R`: S4 class definitions ### Function Structure **Table: Structure of the main `seq_ttest()` function (Level 1)** | Level 2 | Level 3 | Level 4 | |:---------------------------------|:---------------------------------------------|:----------------------| | `build_seq_ttest_arguments()`
*Class: seq_ttest_arguments* | `check_formula()` | | | | `extract_formula()` | | | | `get_one_sample()` | | | | `delete_na()` | | | | `check_data()` | `check_constant_data()` | | `calc_seq_ttest()`
*Class: seq_ttest_results* | `calc_seq_ttest_t_statistic()` | | | | `calc_seq_ttest_non_centrality_parameter()` | | | | `calc_seq_ttest_likelihoods()` | | | | `calc_seq_ttest_boundaries()` | | | | `get_seq_ttest_decision()` | | | | `build_seq_ttest_results()` | | **Table: Structure of the main `seq_anova()` function (Level 1)** | Level 2 | Level 3 | |:---------------------------------|:---------------------------------------------| | `build_seq_anova_arguments()`
*Class: seq_anova_arguments* | `check_formula_anova()`| | | `extract_formula_anova()` | | | `check_data_anova()` | | `calc_seq_anova()`
*Class: seq_anova_results* | `calc_non_centrality_parameter_anova()`| | | `calc_group_means()` | | | `calc_ss_effect()` | | | `calc_ss_residual()` | | | `calc_ss_total()` | | | `calc_F_statistic_()` | | | `calc_likelihoods_anova()` | | | `calc_boundaries()` | | | `get_seq_decision()` | | | `calc_effect_sizes()` | | | `build_seq_anova_results()` | | `calc_plot_anova()`
*Class: seq_anova_results* | | ## Software Testing ### Continuous Integration ## GitHub Structure ## Release Checklist ### Pre-release - [ ] Update version number in DESCRIPTION - [ ] Update NEWS.md with all changes - [ ] Run `devtools::check()` - must pass cleanly - [ ] Update documentation: `devtools::document()` - [ ] Rebuild vignettes: `devtools::build_vignettes()` - [ ] Test on multiple platforms (rhub, win-builder) - [ ] Update README if needed - [ ] Check all examples run correctly - [ ] Verify all URLs in documentation are valid - [ ] Run code coverage: `covr::package_coverage()` - [ ] Update copyright year if needed ### CRAN Submission - [ ] Prepare cran-comments.md - [ ] Submit to CRAN: `devtools::release()` - [ ] Monitor email for CRAN response - [ ] Check CRAN package page after acceptance ### Post-release - [ ] Create GitHub release with tag - [ ] Tweet/announce new version - [ ] Update pkgdown site: `pkgdown::build_site()` - [ ] Increment development version number - [ ] Update NEWS.md with "Development version" section ## Contributing **How to contribute:** 1. Fork the repository 2. Create a feature branch 3. Make changes with tests 4. Submit pull request 5. Respond to review comments **Contribution guidelines:** - Follow existing code style - Add tests for new features - Update documentation - Keep commits focused and atomic - Write clear commit messages