Skip to content

Expose digits argument for h_tbl_median_surv#1469

Merged
shajoezhu merged 20 commits into
mainfrom
copilot/expose-digits-argument-h-tbl-median-surv
Jul 15, 2026
Merged

Expose digits argument for h_tbl_median_surv#1469
shajoezhu merged 20 commits into
mainfrom
copilot/expose-digits-argument-h-tbl-median-surv

Conversation

Copilot AI commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Pull Request

Fixes #1467

Changes

  • h_tbl_median_surv(): Added digits parameter (default: 4) to control signif() precision for median and CI values.
  • control_surv_med_annot(): Added digits parameter to expose the setting via the control interface.
  • g_km(): Passes digits from control_annot_surv_med with %||% 4 fallback for backward compatibility.

Usage

# Via control object in g_km()
g_km(
  df = df,
  variables = variables,
  control_annot_surv_med = control_surv_med_annot(digits = 2)
)

# Direct function call
h_tbl_median_surv(fit_km = fit, digits = 2)

Backward compatible: default value maintains existing behavior.

Copilot AI changed the title [WIP] Expose digits argument for h_tbl_median_surv function Expose digits argument for h_tbl_median_surv Feb 12, 2026
Copilot AI requested a review from shajoezhu February 12, 2026 17:35
@shajoezhu
shajoezhu marked this pull request as ready for review February 12, 2026 18:37
@shajoezhu
shajoezhu requested a review from donyunardi February 12, 2026 18:37
@github-actions

github-actions Bot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Unit Tests Summary

    1 files     85 suites   1m 46s ⏱️
  932 tests   923 ✅   9 💤 0 ❌
2 319 runs  1 603 ✅ 716 💤 0 ❌

Results for commit 9028697.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

Unit Test Performance Difference

Additional test case details
Test Suite $Status$ Time on main $±Time$ Test Case
h_km 👶 $+0.03$ h_tbl_median_surv_works_with_custom_digits_parameter

Results for commit fddfa7f

♻️ This comment has been updated with latest results.

@donyunardi donyunardi left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @shajoezhu

  • Should the digit be exposed all the way to the top to g_km? This is the function that's ultimately being used for tm_g_km
  • there's no request to address h_km. This seems to be out-of-scope from the intended issue. Or is there any relationship between g_km and h_km?
  • CI/CD did not pass, usually we make sure it passed before review.

@Melkiades

Copy link
Copy Markdown
Contributor

is this still active @shajoezhu @donyunardi?

Expose digits parameter (default 4) to control signif() precision
for median survival time and CI values in the annotation table.
The parameter is passed through from g_km() via control_annot_surv_med.
@Melkiades
Melkiades force-pushed the copilot/expose-digits-argument-h-tbl-median-surv branch from 344bf69 to 1b7a759 Compare May 20, 2026 15:12
@Melkiades

Copy link
Copy Markdown
Contributor

@donyunardi all points here should have been addressed:

  1. digits flows through control_surv_med_annot() → g_km(), consistent with how x, y, w, h, fill are already handled. No need for a top-level g_km() argument.
  2. h_tbl_median_surv() is the function from issue [Feature Request]: Expose the digits argument in tern::h_tbl_median_surv() #1467 — it lives in h_km.R. control_surv_med_annot() (same file) is the control interface that connects it to g_km().
  3. Branch rebased on main, snapshots added, CI should be green now (doing roxygen2 fix now)

Melkiades added 3 commits May 20, 2026 20:43
dplyr 1.2.0 deprecated case_match() in favor of recode_values().
@Melkiades
Melkiades requested a review from donyunardi May 20, 2026 18:49
@Melkiades
Melkiades enabled auto-merge (squash) May 20, 2026 18:50
@Melkiades
Melkiades disabled auto-merge May 21, 2026 08:36
Melkiades added 2 commits May 21, 2026 10:39
…surv

Signed-off-by: Davide Garolini <davide.garolini@roche.com>
@github-actions

github-actions Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

badge

Code Coverage Summary

Filename                                   Stmts    Miss  Cover    Missing
---------------------------------------  -------  ------  -------  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
R/abnormal_by_baseline.R                     101       3  97.03%   242, 244-245
R/abnormal_by_marked.R                        88       8  90.91%   94-98, 281, 283-284
R/abnormal_by_worst_grade.R                   94       3  96.81%   215, 217-218
R/abnormal_lab_worsen_by_baseline.R          159      10  93.71%   205-208, 213, 215-216, 459-461
R/abnormal.R                                  78       2  97.44%   222, 224
R/analyze_variables.R                        320      11  96.56%   593-596, 818-823, 831
R/analyze_vars_in_cols.R                     178      14  92.13%   178, 221, 235-236, 238, 246-254
R/bland_altman.R                              92       1  98.91%   46
R/combination_function.R                       9       0  100.00%
R/compare_variables.R                         35       0  100.00%
R/control_incidence_rate.R                    10       0  100.00%
R/control_logistic.R                           7       0  100.00%
R/control_step.R                              23       1  95.65%   58
R/control_survival.R                          16       0  100.00%
R/count_cumulative.R                         115       4  96.52%   74, 270-271, 273
R/count_missed_doses.R                        89       4  95.51%   206-209
R/count_occurrences_by_grade.R               169       8  95.27%   178, 386, 388, 465, 467, 469, 473-474
R/count_occurrences.R                        137      10  92.70%   119, 262-264, 330-332, 334, 338-339
R/count_patients_events_in_cols.R             67       1  98.51%   60
R/count_patients_with_event.R                 73       2  97.26%   220, 223
R/count_patients_with_flags.R                 93       2  97.85%   234, 236
R/count_values.R                              61       2  96.72%   193, 196
R/cox_regression_inter.R                     154       0  100.00%
R/cox_regression.R                           161       0  100.00%
R/coxph.R                                    165       7  95.76%   190-194, 236, 251, 259, 265-266
R/d_pkparam.R                                406       0  100.00%
R/decorate_grob.R                            116       0  100.00%
R/desctools_binom_diff.R                     621      64  89.69%   53, 88-89, 125-126, 129, 199, 223-232, 264, 266, 286, 290, 294, 298, 353, 356, 359, 362, 422, 430, 439, 444-447, 454, 457, 466, 469, 516-517, 519-520, 522-523, 525-526, 593, 604-616, 620, 663, 676, 680
R/df_explicit_na.R                            45       0  100.00%
R/estimate_multinomial_rsp.R                  86       4  95.35%   65, 212, 214-215
R/estimate_proportion.R                      240       7  97.08%   88, 99, 255, 257-258, 389, 553
R/fit_rsp_step.R                              36       0  100.00%
R/fit_survival_step.R                         36       0  100.00%
R/formatting_functions.R                     190       2  98.95%   141, 276
R/g_forest.R                                 585      60  89.74%   240, 252-255, 260-261, 275, 277, 287-290, 335-338, 345, 414, 501, 514, 518-519, 524-525, 538, 554, 601, 630, 705, 714, 720, 739, 794-814, 817, 828, 847, 902, 905, 1040-1045
R/g_ipp.R                                    133       0  100.00%
R/g_km.R                                     354      57  83.90%   285-288, 307-309, 363-366, 400, 428, 432-475, 482-486
R/g_lineplot.R                               261      22  91.57%   222, 397-404, 443-453, 562, 570
R/g_step.R                                    68       1  98.53%   108
R/g_waterfall.R                               47       0  100.00%
R/h_adsl_adlb_merge_using_worst_flag.R        73       0  100.00%
R/h_biomarkers_subgroups.R                    91      23  74.73%   40-42, 84-103
R/h_cox_regression.R                         110       0  100.00%
R/h_incidence_rate.R                          45       0  100.00%
R/h_km.R                                     510      39  92.35%   147, 199-204, 297, 388, 390-391, 402-404, 423, 430-431, 433-435, 443-445, 470, 475-478, 661-664, 1118-1127
R/h_logistic_regression.R                    468       3  99.36%   203-204, 273
R/h_map_for_count_abnormal.R                  54       0  100.00%
R/h_pkparam_sort.R                            15       0  100.00%
R/h_response_biomarkers_subgroups.R           77      12  84.42%   50-55, 107-112
R/h_response_subgroups.R                     178      18  89.89%   257-270, 329-334
R/h_stack_by_baskets.R                        64       1  98.44%   89
R/h_step.R                                   178       0  100.00%
R/h_survival_biomarkers_subgroups.R           73       6  91.78%   111-116
R/h_survival_duration_subgroups.R            207      18  91.30%   259-271, 336-341
R/imputation_rule.R                           17       0  100.00%
R/incidence_rate.R                           103       7  93.20%   68-73, 242
R/logistic_regression.R                      102       0  100.00%
R/missing_data.R                              26       5  80.77%   39, 62-63, 96, 106
R/odds_ratio.R                               157       4  97.45%   270-273
R/prop_diff_test.R                           197       2  98.98%   267, 269
R/prop_diff.R                                526      21  96.01%   97-101, 138, 341, 343, 429-436, 585, 910, 1082, 1086, 1089
R/prune_occurrences.R                         57       0  100.00%
R/response_biomarkers_subgroups.R            124      10  91.94%   88-91, 270-275
R/response_subgroups.R                       252      16  93.65%   100-105, 271-275, 280, 282-283, 310-311
R/riskdiff.R                                  65       4  93.85%   94-97
R/rtables_access.R                            38       0  100.00%
R/score_occurrences.R                         20       1  95.00%   124
R/split_cols_by_groups.R                      49       0  100.00%
R/stat.R                                      59       0  100.00%
R/summarize_ancova.R                         174       2  98.85%   355-356
R/summarize_change.R                          72       3  95.83%   175, 177-178
R/summarize_colvars.R                         13       1  92.31%   75
R/summarize_coxreg.R                         172       0  100.00%
R/summarize_glm_count.R                      269      10  96.28%   129-130, 202-203, 459-463, 596
R/summarize_num_patients.R                   121      10  91.74%   122-124, 244, 248, 252-253, 337-338, 340
R/summarize_patients_exposure_in_cols.R      155       7  95.48%   58, 232-233, 237, 357-358, 362
R/survival_biomarkers_subgroups.R            136      10  92.65%   117-122, 228-231
R/survival_coxph_pairwise.R                  154       9  94.16%   55-56, 124, 138, 145, 149, 288, 290-291
R/survival_duration_subgroups.R              250      15  94.00%   124-129, 268-273, 286, 288-289
R/survival_time.R                            128       1  99.22%   261
R/survival_timepoint.R                       153       2  98.69%   320, 322
R/utils_checkmate.R                           68       0  100.00%
R/utils_default_stats_formats_labels.R       201       0  100.00%
R/utils_factor.R                              87       1  98.85%   99
R/utils_ggplot.R                             110       0  100.00%
R/utils_grid.R                               126       5  96.03%   164, 279-286
R/utils_rtables.R                            125       9  92.80%   39, 46, 414-415, 537-541
R/utils_split_funs.R                          52       2  96.15%   82, 94
R/utils.R                                    141       7  95.04%   131, 134, 137, 141, 150-151, 345
TOTAL                                      12360     594  95.19%

Diff against main

Filename      Stmts    Miss  Cover
----------  -------  ------  -------
R/g_km.R         +4       0  +0.18%
R/h_km.R         +3       0  +0.05%
TOTAL            +7       0  +0.00%

Results for commit: 9028697

Minimum allowed coverage is 80%

♻️ This comment has been updated with latest results

@Melkiades

Copy link
Copy Markdown
Contributor

Any update on this? @donyunardi @shajoezhu?

@shajoezhu

Copy link
Copy Markdown
Contributor

@copilot resolve the merge conflicts in this pull request

Copilot AI commented Jul 9, 2026

Copy link
Copy Markdown
Contributor Author

@copilot resolve the merge conflicts in this pull request

✅ Merge conflicts resolved!

The branch has been successfully rebased onto the latest main. The changes are:

  1. R/h_km.R: Added digits parameter (default: 4) to:

    • control_surv_med_annot() - exposes the setting via control interface
    • h_tbl_median_surv() - controls signif() precision for median and CI values
  2. R/g_km.R: Updated to pass digits from control_annot_surv_med with fallback to 4

  3. Tests: Added test coverage for the new digits parameter and updated snapshots

The roxygen documentation will be automatically generated and committed by CI. All changes maintain backward compatibility with the default value of 4.

Commits: c06ab3f, 54cf3da, 0dab2879

@shajoezhu

shajoezhu commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

see the following example to make it 3 digits

library(nestcolor)

data <- teal_data()
data <- within(data, {
  ADSL <- tmc_ex_adsl
  ADTTE <- tmc_ex_adtte
})
join_keys(data) <- default_cdisc_join_keys[names(data)]

ADSL <- data[["ADSL"]]
ADTTE <- data[["ADTTE"]]

arm_ref_comp <- list(
  ACTARMCD = list(
    ref = "ARM B",
    comp = c("ARM A", "ARM C")
  ),
  ARM = list(
    ref = "B: Placebo",
    comp = c("A: Drug X", "C: Combination")
  )
)

app <- init(
  data = data,
  modules = modules(
    tm_g_km(
      label = "Kaplan-Meier Plot",
      dataname = "ADTTE",
      arm_var = choices_selected(
        variable_choices(ADSL, c("ARM", "ARMCD", "ACTARMCD")),
        "ARM"
      ),
      paramcd = choices_selected(
        value_choices(ADTTE, "PARAMCD", "PARAM"),
        "OS"
      ),
      arm_ref_comp = arm_ref_comp,
      strata_var = choices_selected(
        variable_choices(ADSL, c("SEX", "BMRKR2")),
        "SEX"
      ),
      facet_var = choices_selected(
        variable_choices(ADSL, c("SEX", "BMRKR2")),
        NULL
      ),
      control_annot_surv_med = tern::control_surv_med_annot(digits = 3)
    )
  )
)
if (interactive()) {
  shinyApp(app$ui, app$server)
}
3digits

@shajoezhu

Copy link
Copy Markdown
Contributor

the following example for 5 digits

5digits

default 4 digits

4digits

@donyunardi

Copy link
Copy Markdown

LGTM!

@shajoezhu
shajoezhu merged commit 5e8ae00 into main Jul 15, 2026
29 checks passed
@shajoezhu
shajoezhu deleted the copilot/expose-digits-argument-h-tbl-median-surv branch July 15, 2026 17:11
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 15, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature Request]: Expose the digits argument in tern::h_tbl_median_surv()

4 participants