This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
jsurvival is a jamovi module for survival analysis, part of the ClinicoPath statistical analysis suite. It provides comprehensive survival analysis functions with natural language summaries, Kaplan-Meier plots, Cox regression models, and various survival-related calculations optimized for medical research.
- Main website: https://www.serdarbalci.com/jsurvival/
- ClinicoPath suite: https://sbalci.github.io/ClinicoPathJamoviModule/
- Current version: 0.0.3.90
# Build and check workflow
devtools::document() # Generate documentation from roxygen2
devtools::check() # Run R CMD check locally
devtools::build() # Build package tarball
devtools::install() # Install package locally for testing
# Build jamovi module
jmvtools::install() # Build and install as jamovi module
# Documentation website
pkgdown::build_site() # Build docs site locally
pkgdown::preview_site() # Preview in browser# Run existing tests (limited to stagemigration currently)
devtools::test() # Run all tests
devtools::test_active_file() # Run current test file
# Run single test
testthat::test_file("tests/testthat/test-stagemigration.R")
# To add new tests
usethis::use_test("function-name") # Create test file template# Build jamovi module file (.jmo)
R -e "jmvtools::install()"
# The .jmo file will be created in the build directory
# Current build: jsurvival_0.0.3.90-mac.jmoThe project follows jamovi's R6-based architecture with paired files:
-
R Functions (
/R/):.h.Rfiles: Auto-generated headers defining analysis options.b.Rfiles: Implementation bodies containing analysis logic- Pattern: Each analysis has both
{name}.h.Rand{name}.b.R
-
jamovi Configuration (
/jamovi/):0000.yaml: Module metadata and menu structure.a.yamlfiles: Analysis definitions.r.yamlfiles: Results specifications.u.yamlfiles: UI configurations
-
Analysis Modules:
singlearm: Single arm survival analysis (whole cohort)survival: Univariate survival with group comparisonssurvivalcont: Continuous variable survival with cut-off analysismultisurvival: Multivariable Cox regressionoddsratio: Odds ratio for binary outcomestimeinterval: Time interval calculations (hidden in menu)stagemigration: Stage migration analysis (in development)outcomeorganizer: Outcome data organization (in development)
- Core Framework: jmvcore (jamovi), R6 (classes)
- Survival Analysis: survival, survminer, finalfit, rms, KMunicate
- Time-dependent: pammtools, mgcv, timeROC
- Utilities: dplyr, tidyr, purrr, janitor, glue
- Visualization: ggplot2, scales
- Validation: checkmate, boot, pROC
-
Analysis Implementation:
# In {name}.b.R {name}Class <- R6::R6Class( "{name}Class", inherit = {name}Base, private = list( .run = function() { ... }, .plot = function() { ... } ) )
-
Natural Language Summaries:
- Generated using glue templates
- Stored in
self$results$text$setContent()
-
Plot Generation:
- ggplot2-based plots
- Saved via
self$results$plot$setState()
- R-CMD-check: Multi-platform testing (macOS, Windows, Ubuntu)
- pkgdown: Auto-deploys documentation to GitHub Pages
- Skip trigger: Commits with "WIP" in message skip CI
- Update version in
DESCRIPTION - Run
devtools::check()locally - Build with
jmvtools::install() - Create GitHub release with
.jmofile
- Create jamovi YAML definitions in
/jamovi/ - Generate R files:
jmvtools::install() - Implement analysis logic in
.b.Rfile - Add roxygen documentation
- Create tests if applicable
- Update module menu in
0000.yaml
- Use tidyverse style guide
- Leverage existing utility functions in
utils.R - Include informative error messages via
jmvcore::reject() - Add natural language summaries for user interpretation
- jamovi requires specific R6 class structure - don't modify
.h.Rfiles - Person-time calculations are critical for accurate survival estimates
- Always validate input data types and ranges
- Test with missing data scenarios
- Module not loading: Check
0000.yamlsyntax and version compatibility - Analysis errors: Enable debug mode with
options(jmv.debug = TRUE) - Plot issues: Verify ggplot2 object is properly constructed before setState()
# Enable jamovi debug mode
options(jmv.debug = TRUE)
# Test analysis directly
analysis <- jsurvival::survival(
data = your_data,
elapsedtime = "time_var",
outcome = "status_var",
explanatory = "group_var"
)
analysis$run()The package includes several test datasets in /data/:
histopathology.rda: Example pathology data with survivalmelanoma.rda: Melanoma survival datasetstagemigration_*.rda: Various stage migration test cases
Load test data with: data("dataset_name", package = "jsurvival")