Contribution Guidelines
Source:CONTRIBUTING.md
First of all, thank you very much for taking the time to contribute to the couplr project!
This document provides guidelines for contributing to couplr—its codebase and documentation. These guidelines are meant to guide you, not to restrict you. If in doubt, use your best judgment and feel free to propose improvements through an issue or pull request.
Code of Conduct
This project and everyone participating in it is governed by our Code of Conduct (CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code and maintain a respectful, inclusive environment.
Installation
This installation guide is focused on development. For regular installation, please see the README.
Setting up your R environment
couplr is an R package that uses C++ code via Rcpp and RcppEigen.
-
Install required tools
- R (≥ 3.5.0)
- Rtools (Windows) or Xcode Command Line Tools (macOS)
- Git
- An editor or IDE (RStudio, VS Code, etc.)
-
Install development dependencies
install.packages(c("devtools", "roxygen2", "testthat", "rmarkdown", "knitr", "pkgdown", "Rcpp", "RcppEigen")) -
Load the development build
devtools::load_all()
Installing from source
Build and install the package locally:
devtools::install()If you modify C++ code, rebuild the DLL before reinstalling:
Regenerate documentation with:
devtools::document()After modifying C++ code or adding [[Rcpp::export]] functions:
Rcpp::compileAttributes()
devtools::document()
devtools::load_all()Testing
couplr uses testthat for testing. All tests are located in tests/testthat/.
Run the full test suite:
devtools::test()Run a complete package check:
devtools::check()Run a subset of tests during development:
Guidelines: - Keep tests fast and reproducible. - Use set.seed() for random data. - Include edge cases and expected failures. - Prefer small examples to large datasets.
Documentation
Install dependencies
install.packages(c("rmarkdown", "knitr", "pkgdown"))Building the documentation
Build vignettes:
devtools::build_vignettes()Build the pkgdown site locally:
pkgdown::build_site()The generated site is saved in the docs/ directory. Open docs/index.html in your browser to view it.
Project organization
couplr/
├── .github/ <- Continuous integration workflows
├── .gitignore
├── .Rbuildignore
├── couplr.Rproj
├── DESCRIPTION <- Package metadata
├── NAMESPACE <- Function exports and imports
├── LICENSE
├── LICENSE.md
├── NEWS.md
├── README.md
├── _pkgdown.yml
├── R/ <- R source files
├── src/ <- C++ source files (Rcpp/RcppEigen)
│ ├── core/ <- Core utilities
│ ├── solvers/ <- LAP algorithm implementations
│ └── rcpp_interface.cpp <- All [[Rcpp::export]] declarations
├── man/ <- Generated documentation
├── inst/ <- Installed files (e.g., CITATION, extdata)
├── vignettes/ <- Long-form documentation and usage examples
├── tests/
│ └── testthat/ <- Unit tests
├── docs/ <- pkgdown website (generated)
├── doc/ <- Built vignettes for local preview (ignored in Git)
├── Meta/ <- Metadata created during package build (ignored)
└── couplr.Rcheck/ <- Artifacts from local package checks (ignored)
Contributing workflow
-
Create a feature branch
Make focused commits with clear messages.
-
Run tests and checks before committing:
Update documentation with
roxygen2andNEWS.md.Update vignettes/examples if user-facing behavior changes.
Open a pull request with a short description of your change.
Respond to review feedback constructively.
Style guidelines
R code
- Use descriptive names and consistent indentation.
- Prefer vectorized operations over loops.
- Validate inputs early with clear error messages.
- Document all exported functions with roxygen2.
C++ code
- C++17 is required.
- Keep headers minimal and separate interface from implementation.
- Use RAII where possible.
- Comment on algorithmic details or numerical behavior.
- Avoid unnecessary memory allocations.
-
Export pattern: Do NOT put
[[Rcpp::export]]in subdirectory files. Instead, create_implfunctions in subdirectories and add exported wrappers insrc/rcpp_interface.cpp.
Reporting bugs
When reporting an issue, please include: - A minimal reproducible example (reprex) - Output of sessionInfo() - Expected vs. actual results - Method/algorithm used if relevant - R and operating system version - Toolchain info if relevant (e.g., Rtools on Windows)
By contributing to couplr, you agree that your code is released under the same license as the package.