From fbeff96a3c53f93c768efa6894bdb97c97b2cee7 Mon Sep 17 00:00:00 2001 From: Kyle Bittinger Date: Mon, 6 Apr 2026 06:19:16 -0400 Subject: [PATCH 1/8] Revise README for native pipe --- DESCRIPTION | 2 +- README.Rmd | 28 +++---- README.md | 76 ++++++++++-------- .../figures/README-farmm_final_pcoa-1.png | Bin man/figures/README-farmm_pcoa-1.png | Bin 0 -> 66459 bytes tools/readme/farmm_pcoa-1.png | Bin 66476 -> 0 bytes 6 files changed, 58 insertions(+), 48 deletions(-) rename tools/readme/farmm_final_pcoa-1.png => man/figures/README-farmm_final_pcoa-1.png (100%) create mode 100644 man/figures/README-farmm_pcoa-1.png delete mode 100644 tools/readme/farmm_pcoa-1.png diff --git a/DESCRIPTION b/DESCRIPTION index 902b1d4..f308f7c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -16,7 +16,7 @@ Description: Contains a tidy method for adonis results, custom permutation License: GPL-3 + file LICENSE Encoding: UTF-8 LazyData: true -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.3 Imports: generics (>= 0.0.2), rlang, diff --git a/README.Rmd b/README.Rmd index 4c4ad4b..cd125b6 100644 --- a/README.Rmd +++ b/README.Rmd @@ -6,7 +6,7 @@ output: github_document ```{r, echo = FALSE} knitr::opts_chunk$set( - fig.path = "tools/readme/" + fig.path = "man/figures/README-" ) ``` @@ -67,9 +67,9 @@ the last time point obtained for each participant. We'll make a new data frame, `farmm_final`, containing just the samples we need. ```{r} -farmm_final <- farmm_samples %>% - group_by(subject_id) %>% - filter(study_day == max(study_day)) %>% +farmm_final <- farmm_samples |> + group_by(subject_id) |> + filter(study_day == max(study_day)) |> ungroup() ``` @@ -83,7 +83,7 @@ distance matrix over and over as you filter and re-arrange the samples. Here, we specify this column as `sample_id`. ```{r} -farmm_final %>% +farmm_final |> pcoaplus(distmat = farmm_bc, sample_id_var = sample_id) ``` @@ -95,8 +95,8 @@ default mapping to color the samples by diet. We also add a few elements to the `ggplot` object, to set the color scale and change the theme. ```{r farmm_final_pcoa} -farmm_final %>% - pcoaplus(distmat = farmm_bc, sample_id_var = sample_id) %>% +farmm_final |> + pcoaplus(distmat = farmm_bc, sample_id_var = sample_id) |> plot(color = diet) + scale_color_brewer(palette = "Set1") + theme_bw() @@ -113,7 +113,7 @@ an additional argument to let the function know which column of the data frame corresponds to the IDs in the distance matrix. ```{r} -farmm_final %>% +farmm_final |> adonisplus( distmat = farmm_bc, formula = distmat ~ diet, sample_id_var = sample_id) @@ -132,7 +132,7 @@ are the same as `adonisplus()`, but we add an additional argument, `which`, to specify the variable on which we want to carry out pairwise comparisons. ```{r} -farmm_final %>% +farmm_final |> adonispost( distmat = farmm_bc, formula = distmat ~ diet, sample_id_var = sample_id, which = diet) @@ -148,8 +148,8 @@ time for each diet. To get an overview, we'll re-generate Figure 2A from the paper. ```{r farmm_pcoa} -farmm_samples %>% - pcoaplus(distmat = farmm_bc, sample_id_var = "sample_id") %>% +farmm_samples |> + pcoaplus(distmat = farmm_bc, sample_id_var = "sample_id") |> plot(color = study_day) + facet_grid(~ diet) + scale_color_viridis_c(direction = -1) + @@ -166,7 +166,7 @@ To investigate both claims, we'll limit the data set to the pre-antibiotics period, and call it `farmm_preabx`. ```{r} -farmm_preabx <- farmm_samples %>% +farmm_preabx <- farmm_samples |> filter(antibiotics %in% "pre") ``` @@ -178,7 +178,7 @@ tell it to randomly re-assign diet between subjects, and randomly shuffle the study days within each subject. ```{r} -farmm_preabx %>% +farmm_preabx |> adonisplus( distmat = farmm_bc, formula = distmat ~ diet * study_day, sample_id_var = sample_id, rep_meas_var = subject_id, @@ -202,7 +202,7 @@ diet pairs are different. As before, we use `adonispost()` and tell it to run pairwise comparisons of diet by setting `which = diet`. ```{r} -farmm_preabx %>% +farmm_preabx |> adonispost( distmat = farmm_bc, formula = distmat ~ diet * study_day, sample_id_var = sample_id, rep_meas_var = subject_id, diff --git a/README.md b/README.md index fe0af2f..b92eb77 100644 --- a/README.md +++ b/README.md @@ -76,9 +76,9 @@ We’ll make a new data frame, `farmm_final`, containing just the samples we need. ``` r -farmm_final <- farmm_samples %>% - group_by(subject_id) %>% - filter(study_day == max(study_day)) %>% +farmm_final <- farmm_samples |> + group_by(subject_id) |> + filter(study_day == max(study_day)) |> ungroup() ``` @@ -93,7 +93,7 @@ over and over as you filter and re-arrange the samples. Here, we specify this column as `sample_id`. ``` r -farmm_final %>% +farmm_final |> pcoaplus(distmat = farmm_bc, sample_id_var = sample_id) ``` @@ -123,14 +123,14 @@ by diet. We also add a few elements to the `ggplot` object, to set the color scale and change the theme. ``` r -farmm_final %>% - pcoaplus(distmat = farmm_bc, sample_id_var = sample_id) %>% +farmm_final |> + pcoaplus(distmat = farmm_bc, sample_id_var = sample_id) |> plot(color = diet) + scale_color_brewer(palette = "Set1") + theme_bw() ``` -![](tools/readme/farmm_final_pcoa-1.png) +![](man/figures/README-farmm_final_pcoa-1.png) It looks like the microbiome of the EEN diet group is different from that in the omnivore and vegan groups. Let’s test for differences @@ -144,7 +144,7 @@ additional argument to let the function know which column of the data frame corresponds to the IDs in the distance matrix. ``` r -farmm_final %>% +farmm_final |> adonisplus( distmat = farmm_bc, formula = distmat ~ diet, sample_id_var = sample_id) @@ -153,7 +153,7 @@ farmm_final %>% ## # A tibble: 3 × 6 ## term df sumsq r.squared statistic p.value ## - ## 1 Model 2 1.84 0.168 2.73 0.001 + ## 1 diet 2 1.84 0.168 2.73 0.001 ## 2 Residual 27 9.07 0.832 NA NA ## 3 Total 29 10.9 1 NA NA @@ -171,7 +171,7 @@ from each other. To run the pairwise comparisons, we’ll use the variable on which we want to carry out pairwise comparisons. ``` r -farmm_final %>% +farmm_final |> adonispost( distmat = farmm_bc, formula = distmat ~ diet, sample_id_var = sample_id, which = diet) @@ -180,10 +180,10 @@ farmm_final %>% ## # A tibble: 4 × 7 ## comparison term df sumsq r.squared statistic p.value ## - ## 1 All diet Model 2 1.84 0.168 2.73 0.001 - ## 2 Omnivore - Vegan Model 1 0.445 0.0671 1.30 0.159 - ## 3 Omnivore - EEN Model 1 1.15 0.159 3.39 0.001 - ## 4 Vegan - EEN Model 1 1.16 0.165 3.56 0.001 + ## 1 All diet diet 2 1.84 0.168 2.73 0.001 + ## 2 Omnivore - Vegan diet 1 0.445 0.0671 1.30 0.159 + ## 3 Omnivore - EEN diet 1 1.15 0.159 3.39 0.001 + ## 4 Vegan - EEN diet 1 1.16 0.165 3.56 0.001 The results are as expected. So, far we could have done all of this work using the functions in `vegan` and `ape`, without much difficulty. @@ -195,15 +195,15 @@ over time for each diet. To get an overview, we’ll re-generate Figure 2A from the paper. ``` r -farmm_samples %>% - pcoaplus(distmat = farmm_bc, sample_id_var = "sample_id") %>% +farmm_samples |> + pcoaplus(distmat = farmm_bc, sample_id_var = "sample_id") |> plot(color = study_day) + facet_grid(~ diet) + scale_color_viridis_c(direction = -1) + theme_bw() ``` -![](tools/readme/farmm_pcoa-1.png) +![](man/figures/README-farmm_pcoa-1.png) The paper reports that “EEN led to a significant change in the microbiota composition within 3 days of the dietary phase relative to @@ -216,7 +216,7 @@ To investigate both claims, we’ll limit the data set to the pre-antibiotics period, and call it `farmm_preabx`. ``` r -farmm_preabx <- farmm_samples %>% +farmm_preabx <- farmm_samples |> filter(antibiotics %in% "pre") ``` @@ -229,19 +229,21 @@ between subjects, and randomly shuffle the study days within each subject. ``` r -farmm_preabx %>% +farmm_preabx |> adonisplus( distmat = farmm_bc, formula = distmat ~ diet * study_day, sample_id_var = sample_id, rep_meas_var = subject_id, shuffle = c(diet = "between", study_day = "within")) ``` - ## # A tibble: 3 × 6 - ## term df sumsq r.squared statistic p.value - ## - ## 1 Model 5 5.51 0.132 4.38 0.001 - ## 2 Residual 144 36.2 0.868 NA NA - ## 3 Total 149 41.7 1 NA NA + ## # A tibble: 5 × 6 + ## term df sumsq r.squared statistic p.value + ## + ## 1 diet 2 4.34 0.104 8.62 0.001 + ## 2 study_day 1 0.504 0.0121 2.00 0.001 + ## 3 diet:study_day 2 0.663 0.0159 1.32 0.001 + ## 4 Residual 144 36.2 0.868 NA NA + ## 5 Total 149 41.7 1 NA NA If you run this function yourself, you’ll notice that it takes a lot longer than it takes to run `adonis()`. As we randomly re-assign diets @@ -256,7 +258,7 @@ which diet pairs are different. As before, we use `adonispost()` and tell it to run pairwise comparisons of diet by setting `which = diet`. ``` r -farmm_preabx %>% +farmm_preabx |> adonispost( distmat = farmm_bc, formula = distmat ~ diet * study_day, sample_id_var = sample_id, rep_meas_var = subject_id, @@ -264,13 +266,21 @@ farmm_preabx %>% which = diet) ``` - ## # A tibble: 4 × 7 - ## comparison term df sumsq r.squared statistic p.value - ## - ## 1 All diet Model 5 5.51 0.132 4.38 0.001 - ## 2 Omnivore - Vegan Model 3 1.79 0.0679 2.36 0.15 - ## 3 Omnivore - EEN Model 3 3.04 0.110 4.07 0.001 - ## 4 Vegan - EEN Model 3 4.06 0.149 5.35 0.001 + ## # A tibble: 12 × 7 + ## comparison term df sumsq r.squared statistic p.value + ## + ## 1 All diet diet 2 4.34 0.104 8.62 0.001 + ## 2 All diet study_day 1 0.504 0.0121 2.00 0.001 + ## 3 All diet diet:study_day 2 0.663 0.0159 1.32 0.001 + ## 4 Omnivore - Vegan diet 1 1.68 0.0635 6.61 0.119 + ## 5 Omnivore - Vegan study_day 1 0.0804 0.00305 0.317 0.726 + ## 6 Omnivore - Vegan diet:study_day 1 0.0358 0.00136 0.141 0.988 + ## 7 Omnivore - EEN diet 1 1.89 0.0683 7.59 0.025 + ## 8 Omnivore - EEN study_day 1 0.628 0.0227 2.53 0.001 + ## 9 Omnivore - EEN diet:study_day 1 0.523 0.0189 2.10 0.001 + ## 10 Vegan - EEN diet 1 2.99 0.109 11.8 0.001 + ## 11 Vegan - EEN study_day 1 0.668 0.0245 2.64 0.001 + ## 12 Vegan - EEN diet:study_day 1 0.399 0.0146 1.58 0.001 In the pairwise comparisons, we find that the microbiome of the omnivore and vegan groups was not different during the pre-antibiotics period, diff --git a/tools/readme/farmm_final_pcoa-1.png b/man/figures/README-farmm_final_pcoa-1.png similarity index 100% rename from tools/readme/farmm_final_pcoa-1.png rename to man/figures/README-farmm_final_pcoa-1.png diff --git a/man/figures/README-farmm_pcoa-1.png b/man/figures/README-farmm_pcoa-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1476a6cbbea3f691d77fa535f605889cbdae05 GIT binary patch literal 66459 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 literal 0 HcmV?d00001 diff --git a/tools/readme/farmm_pcoa-1.png b/tools/readme/farmm_pcoa-1.png deleted file mode 100644 index 34dd6d5f3586bd138ce0128b2044e08ad4c176fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66476 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

Date: Mon, 6 Apr 2026 06:47:34 -0400 Subject: [PATCH 2/8] Remove native pipe in package code, increase minimum R version --- DESCRIPTION | 2 +- R/adonis-custom.R | 28 +++++++++++----------- R/ordination.R | 32 ++++++++++++------------- data-raw/farmm.R | 36 ++++++++++++++--------------- tests/testthat/test-adonis-custom.R | 2 +- 5 files changed, 50 insertions(+), 50 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f308f7c..34fa544 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -29,7 +29,7 @@ Imports: ggplot2, stringr Depends: - R (>= 2.10) + R (>= 4.1.0) Suggests: covr, testthat diff --git a/R/adonis-custom.R b/R/adonis-custom.R index 2e727fb..89526a8 100644 --- a/R/adonis-custom.R +++ b/R/adonis-custom.R @@ -34,8 +34,8 @@ adonisplus <- function(data, distmat, formula, sample_id_var = SampleID, rep_meas_var = subject_id, shuffle = NULL, permutations = 999, seed = 42) { - sample_ids <- data %>% - dplyr::pull({{ sample_id_var }}) %>% + sample_ids <- data |> + dplyr::pull({{ sample_id_var }}) |> as.character() distmat <- usedist::dist_subset(distmat, sample_ids) formula <- stats::as.formula(formula) @@ -49,7 +49,7 @@ adonisplus <- function(data, distmat, formula, sample_id_var = SampleID, result <- tidy.anova.cca(a_observed) if (!is.null(shuffle)) { - rep_meas_vals <- data %>% + rep_meas_vals <- data |> dplyr::pull({{ rep_meas_var }}) # Here, vars is the variables that will undergo custom permutations @@ -112,26 +112,26 @@ adonisplus <- function(data, distmat, formula, sample_id_var = SampleID, adonispost <- function(data, ..., which = study_group, alpha = 0.05) { var_name <- rlang::as_name(rlang::ensym(which)) - result_main <- adonisplus(data, ...) %>% - dplyr::mutate(comparison = paste("All", var_name)) %>% - dplyr::select(comparison, term, dplyr::everything()) %>% + result_main <- adonisplus(data, ...) |> + dplyr::mutate(comparison = paste("All", var_name)) |> + dplyr::select(comparison, term, dplyr::everything()) |> dplyr::filter(!(term %in% c("Residual", "Total"))) - var_levels <- data %>% - dplyr::pull({{ which }}) %>% - as.factor() %>% + var_levels <- data |> + dplyr::pull({{ which }}) |> + as.factor() |> levels() pairs <- utils::combn(var_levels, 2, simplify = FALSE) make_pairwise_comparison <- function(pair) { - pair_data <- data %>% + pair_data <- data |> dplyr::filter({{ which }} %in% pair) - adonisplus(pair_data, ...) %>% - dplyr::mutate(comparison = paste(pair, collapse = " - ")) %>% - dplyr::select(comparison, term, dplyr::everything()) %>% + adonisplus(pair_data, ...) |> + dplyr::mutate(comparison = paste(pair, collapse = " - ")) |> + dplyr::select(comparison, term, dplyr::everything()) |> dplyr::filter(!(term %in% c("Residual", "Total"))) } - result_posthoc <- lapply(pairs, make_pairwise_comparison) %>% + result_posthoc <- lapply(pairs, make_pairwise_comparison) |> dplyr::bind_rows() dplyr::bind_rows(result_main, result_posthoc) } diff --git a/R/ordination.R b/R/ordination.R index 6272e13..d5a9afe 100644 --- a/R/ordination.R +++ b/R/ordination.R @@ -25,19 +25,19 @@ pcoaplus <- function(data, distmat, sample_id_var = SampleID, num_axes = 2) { axis_numbers <- 1:num_axes axis_names <- paste0("Axis.", axis_numbers) - sample_ids <- data %>% - dplyr::pull({{ sample_id_var }}) %>% + sample_ids <- data |> + dplyr::pull({{ sample_id_var }}) |> as.character() stopifnot("Duplicated sample IDs" = anyDuplicated(sample_ids) == 0) distmat <- usedist::dist_subset(distmat, sample_ids) sample_id_var_name <- rlang::as_name(rlang::ensym(sample_id_var)) pcoa_obj <- ape::pcoa(distmat) - pcoa_df <- pcoa_obj$vectors %>% - `[`(sample_ids, axis_names) %>% - as.data.frame() %>% - tibble::rownames_to_column(sample_id_var_name) %>% - tibble::as_tibble() %>% + pcoa_df <- pcoa_obj$vectors |> + (\(x) x[sample_ids, axis_names])() |> + as.data.frame() |> + tibble::rownames_to_column(sample_id_var_name) |> + tibble::as_tibble() |> dplyr::left_join(data, by = sample_id_var_name) pctvar <- (pcoa_obj$values$Relative_eig * 100)[axis_numbers] @@ -56,7 +56,7 @@ pcoaplus <- function(data, distmat, sample_id_var = SampleID, num_axes = 2) { #' @describeIn pcoaplus Make a principal coordinates scatter plot #' @export plot.pcoaplus <- function(x, ...) { - x %>% + x |> ggplot2::ggplot() + ggplot2::geom_point(ggplot2::aes(x = Axis.1, y = Axis.2, ...)) + ggplot2::coord_equal() + @@ -87,19 +87,19 @@ nmdsplus <- function(data, distmat, sample_id_var = SampleID, num_axes = 2) { num_axes <- as.integer(num_axes) stopifnot("num_axes must be 2 or more" = num_axes >= 2) - sample_ids <- data %>% - dplyr::pull({{ sample_id_var }}) %>% + sample_ids <- data |> + dplyr::pull({{ sample_id_var }}) |> as.character() stopifnot("Duplicated sample IDs" = anyDuplicated(sample_ids) == 0) distmat <- usedist::dist_subset(distmat, sample_ids) sample_id_var_name <- rlang::as_name(rlang::ensym(sample_id_var)) nmds_obj <- vegan::monoMDS(distmat, k = num_axes) - nmds_df <- nmds_obj$points %>% - `[`(sample_ids, ) %>% - as.data.frame() %>% - tibble::rownames_to_column(sample_id_var_name) %>% - tibble::as_tibble() %>% + nmds_df <- nmds_obj$points |> + (\(x) x[sample_ids, ])() |> + as.data.frame() |> + tibble::rownames_to_column(sample_id_var_name) |> + tibble::as_tibble() |> dplyr::left_join(data, by = sample_id_var_name) attr(nmds_df, "stress") <- nmds_obj$stress @@ -111,7 +111,7 @@ nmdsplus <- function(data, distmat, sample_id_var = SampleID, num_axes = 2) { #' @describeIn nmdsplus Make an NMDS scatter plot #' @export plot.nmdsplus <- function(x, ...) { - x %>% + x |> ggplot2::ggplot() + ggplot2::geom_point(ggplot2::aes(x = MDS1, y = MDS2, ...)) } diff --git a/data-raw/farmm.R b/data-raw/farmm.R index b73abda..950332a 100644 --- a/data-raw/farmm.R +++ b/data-raw/farmm.R @@ -2,18 +2,18 @@ library(tidyverse) library(usedist) farmm_samples <- read_tsv( - "data-raw/farmm_samples.tsv", show_col_types = FALSE) %>% - filter(SampleType %in% "Feces") %>% - filter(Keep) %>% - filter(!(study_day %in% "PS")) %>% - mutate(study_day = as.integer(study_day)) %>% - mutate(study_group = fct_relevel(study_group, "Omnivore", "Vegan", "EEN")) %>% + "data-raw/farmm_samples.tsv", show_col_types = FALSE) |> + filter(SampleType %in% "Feces") |> + filter(Keep) |> + filter(!(study_day %in% "PS")) |> + mutate(study_day = as.integer(study_day)) |> + mutate(study_group = fct_relevel(study_group, "Omnivore", "Vegan", "EEN")) |> mutate(current_antibiotics = fct_recode( current_antibiotics, pre = "Pre Antibiotics", - current = "Antibiotics Treatment", post = "Post Antibiotics")) %>% + current = "Antibiotics Treatment", post = "Post Antibiotics")) |> mutate(current_antibiotics = fct_relevel( - current_antibiotics, "pre", "current", "post")) %>% - mutate(host_frac = host / (host + non_host)) %>% + current_antibiotics, "pre", "current", "post")) |> + mutate(host_frac = host / (host + non_host)) |> mutate(new_sample_id = paste( "farmm", SubjectID, sprintf("%02d", study_day), sep = ".")) @@ -21,16 +21,16 @@ farmm_new_sample_ids <- farmm_samples$new_sample_id names(farmm_new_sample_ids) <- farmm_samples$SampleID farmm_bc <- read_tsv( - "data-raw/farmm_bc.tsv", show_col_types = FALSE) %>% - rename(sample_id = `...1`) %>% - column_to_rownames("sample_id") %>% - as.matrix() %>% - `[`(farmm_samples$SampleID, farmm_samples$SampleID) + "data-raw/farmm_bc.tsv", show_col_types = FALSE) |> + rename(sample_id = `...1`) |> + column_to_rownames("sample_id") |> + as.matrix() |> + (\(x) x[farmm_samples$SampleID, farmm_samples$SampleID])() colnames(farmm_bc) <- farmm_new_sample_ids[colnames(farmm_bc)] rownames(farmm_bc) <- farmm_new_sample_ids[rownames(farmm_bc)] -farmm_samples <- farmm_samples %>% +farmm_samples <- farmm_samples |> select( sample_id = new_sample_id, subject_id = SubjectID, @@ -42,11 +42,11 @@ farmm_samples <- farmm_samples %>% age = Age, bacterial_16S_copies = copy_num_per_gram_feces, num_reads = non_host, - host_frac) %>% + host_frac) |> arrange(diet, subject_id, study_day) -farmm_bc <- farmm_bc %>% - as.dist() %>% +farmm_bc <- farmm_bc |> + as.dist() |> dist_subset(farmm_samples$sample_id) usethis::use_data(farmm_samples, overwrite = TRUE) diff --git a/tests/testthat/test-adonis-custom.R b/tests/testthat/test-adonis-custom.R index 7f27a37..37d70a8 100644 --- a/tests/testthat/test-adonis-custom.R +++ b/tests/testthat/test-adonis-custom.R @@ -22,7 +22,7 @@ example_dist <- structure( ) test_that("adonispost works", { - example_data_3groups <- example_data %>% + example_data_3groups <- example_data |> dplyr::mutate(study_group = rep(c("G1", "G2", "G3", "G1", "G2", "G3"), c(2, 2, 1, 2, 2, 2))) observed <- adonispost( example_data_3groups, example_dist, distmat ~ study_group, From b5bcdd62357e2363b039cb3600cf1640a1fd19f8 Mon Sep 17 00:00:00 2001 From: Kyle Bittinger Date: Mon, 6 Apr 2026 06:54:18 -0400 Subject: [PATCH 3/8] Reformat with air --- R/adonis-custom.R | 25 ++++- R/tidy.R | 15 ++- R/util.R | 8 +- data-raw/farmm.R | 42 +++++-- tests/testthat/test-adonis-custom.R | 168 ++++++++++++++++++++++------ tests/testthat/test-farmm.R | 20 +++- tests/testthat/test-ordination.R | 154 ++++++++++++++++++++----- 7 files changed, 347 insertions(+), 85 deletions(-) diff --git a/R/adonis-custom.R b/R/adonis-custom.R index 89526a8..bd57b99 100644 --- a/R/adonis-custom.R +++ b/R/adonis-custom.R @@ -31,9 +31,16 @@ #' subjects, preserving the value within each subject. Conversely, the values #' of the time point will be shuffled only within each subject. #' @export -adonisplus <- function(data, distmat, formula, sample_id_var = SampleID, - rep_meas_var = subject_id, shuffle = NULL, - permutations = 999, seed = 42) { +adonisplus <- function( + data, + distmat, + formula, + sample_id_var = SampleID, + rep_meas_var = subject_id, + shuffle = NULL, + permutations = 999, + seed = 42 +) { sample_ids <- data |> dplyr::pull({{ sample_id_var }}) |> as.character() @@ -44,7 +51,10 @@ adonisplus <- function(data, distmat, formula, sample_id_var = SampleID, set.seed(seed) a_observed <- vegan::adonis2( - formula = formula, data = data, permutations = permutations, by = "terms" + formula = formula, + data = data, + permutations = permutations, + by = "terms" ) result <- tidy.anova.cca(a_observed) @@ -82,8 +92,11 @@ adonisplus <- function(data, distmat, formula, sample_id_var = SampleID, trial_data[[var]] <- new_vals } trial_a <- vegan::adonis2( - formula, trial_data, permutations = 4, by = "terms" - ) + formula, + trial_data, + permutations = 4, + by = "terms" + ) trial_result <- tidy.anova.cca(trial_a) trial_result$statistic[term_idx] }) diff --git a/R/tidy.R b/R/tidy.R index 4189cb7..e6084b7 100644 --- a/R/tidy.R +++ b/R/tidy.R @@ -22,7 +22,13 @@ generics::tidy tidy.adonis <- function(x, ...) { ret <- tibble::as_tibble(x$aov.tab, rownames = "term") colnames(ret) <- c( - "term", "df", "sumsq", "meansq", "statistic", "r.squared", "p.value" + "term", + "df", + "sumsq", + "meansq", + "statistic", + "r.squared", + "p.value" ) attr(ret, "heading") <- NULL ret @@ -45,7 +51,12 @@ tidy.adonis <- function(x, ...) { tidy.anova.cca <- function(x, ...) { ret <- tibble::as_tibble(x, rownames = "term") colnames(ret) <- c( - "term", "df", "sumsq", "r.squared", "statistic", "p.value" + "term", + "df", + "sumsq", + "r.squared", + "statistic", + "p.value" ) attr(ret, "Random.seed") <- NULL attr(ret, "F.perm") <- NULL diff --git a/R/util.R b/R/util.R index 8805b15..66257ed 100644 --- a/R/util.R +++ b/R/util.R @@ -3,8 +3,12 @@ check_lhs <- function(formula, expected) { expected_lhs <- expected[[2]] if (formula_lhs != expected_lhs) { stop( - "LHS of formula must be exactly '", expected_lhs, "'. ", - "Saw '", formula_lhs, "'." + "LHS of formula must be exactly '", + expected_lhs, + "'. ", + "Saw '", + formula_lhs, + "'." ) } } diff --git a/data-raw/farmm.R b/data-raw/farmm.R index 950332a..afd35ea 100644 --- a/data-raw/farmm.R +++ b/data-raw/farmm.R @@ -2,26 +2,47 @@ library(tidyverse) library(usedist) farmm_samples <- read_tsv( - "data-raw/farmm_samples.tsv", show_col_types = FALSE) |> + "data-raw/farmm_samples.tsv", + show_col_types = FALSE +) |> filter(SampleType %in% "Feces") |> filter(Keep) |> filter(!(study_day %in% "PS")) |> mutate(study_day = as.integer(study_day)) |> mutate(study_group = fct_relevel(study_group, "Omnivore", "Vegan", "EEN")) |> - mutate(current_antibiotics = fct_recode( - current_antibiotics, pre = "Pre Antibiotics", - current = "Antibiotics Treatment", post = "Post Antibiotics")) |> - mutate(current_antibiotics = fct_relevel( - current_antibiotics, "pre", "current", "post")) |> + mutate( + current_antibiotics = fct_recode( + current_antibiotics, + pre = "Pre Antibiotics", + current = "Antibiotics Treatment", + post = "Post Antibiotics" + ) + ) |> + mutate( + current_antibiotics = fct_relevel( + current_antibiotics, + "pre", + "current", + "post" + ) + ) |> mutate(host_frac = host / (host + non_host)) |> - mutate(new_sample_id = paste( - "farmm", SubjectID, sprintf("%02d", study_day), sep = ".")) + mutate( + new_sample_id = paste( + "farmm", + SubjectID, + sprintf("%02d", study_day), + sep = "." + ) + ) farmm_new_sample_ids <- farmm_samples$new_sample_id names(farmm_new_sample_ids) <- farmm_samples$SampleID farmm_bc <- read_tsv( - "data-raw/farmm_bc.tsv", show_col_types = FALSE) |> + "data-raw/farmm_bc.tsv", + show_col_types = FALSE +) |> rename(sample_id = `...1`) |> column_to_rownames("sample_id") |> as.matrix() |> @@ -42,7 +63,8 @@ farmm_samples <- farmm_samples |> age = Age, bacterial_16S_copies = copy_num_per_gram_feces, num_reads = non_host, - host_frac) |> + host_frac + ) |> arrange(diet, subject_id, study_day) farmm_bc <- farmm_bc |> diff --git a/tests/testthat/test-adonis-custom.R b/tests/testthat/test-adonis-custom.R index 37d70a8..082f17e 100644 --- a/tests/testthat/test-adonis-custom.R +++ b/tests/testthat/test-adonis-custom.R @@ -1,7 +1,5 @@ example_data <- tibble::tibble( - SampleID = c( - "C1", "C2", "C3", "C4", "C5", "P1", "P2", "P3", "P4", "P5", "P6" - ), + SampleID = paste0(c(rep("C", 5), rep("P", 6)), c(1:5, 1:6)), time_point = c(rep("C", 5), rep("P", 6)), SubjectID = paste0("S", c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6)), study_group = rep(c("G1", "G2", "G1", "G2"), c(3, 2, 3, 3)), @@ -10,22 +8,82 @@ example_data <- tibble::tibble( example_dist <- structure( c( - 0.367, 0.495, 0.425, 0.432, 0.698, 0.812, 0.698, 0.605, 0.41, 0.522, 0.461, - 0.417, 0.411, 0.687, 0.809, 0.655, 0.618, 0.385, 0.47, 0.348, 0.233, 0.416, - 0.84, 0.472, 0.497, 0.34, 0.412, 0.393, 0.559, 0.781, 0.499, 0.484, 0.409, - 0.467, 0.474, 0.804, 0.598, 0.495, 0.257, 0.403, 0.82, 0.59, 0.586, 0.525, - 0.594, 0.877, 0.832, 0.794, 0.83, 0.498, 0.6, 0.556, 0.447, 0.483, 0.348 + 0.367, + 0.495, + 0.425, + 0.432, + 0.698, + 0.812, + 0.698, + 0.605, + 0.41, + 0.522, + 0.461, + 0.417, + 0.411, + 0.687, + 0.809, + 0.655, + 0.618, + 0.385, + 0.47, + 0.348, + 0.233, + 0.416, + 0.84, + 0.472, + 0.497, + 0.34, + 0.412, + 0.393, + 0.559, + 0.781, + 0.499, + 0.484, + 0.409, + 0.467, + 0.474, + 0.804, + 0.598, + 0.495, + 0.257, + 0.403, + 0.82, + 0.59, + 0.586, + 0.525, + 0.594, + 0.877, + 0.832, + 0.794, + 0.83, + 0.498, + 0.6, + 0.556, + 0.447, + 0.483, + 0.348 ), Labels = c("C1", "C2", "C3", "C4", "C5", "P1", "P2", "P3", "P4", "P5", "P6"), - Size = 11L, call = quote(as.dist.default(m = cp_dist)), class = "dist", - Diag = FALSE, Upper = FALSE + Size = 11L, + call = quote(as.dist.default(m = cp_dist)), + class = "dist", + Diag = FALSE, + Upper = FALSE ) test_that("adonispost works", { example_data_3groups <- example_data |> - dplyr::mutate(study_group = rep(c("G1", "G2", "G3", "G1", "G2", "G3"), c(2, 2, 1, 2, 2, 2))) + dplyr::mutate( + study_group = rep( + c("G1", "G2", "G3", "G1", "G2", "G3"), + c(2, 2, 1, 2, 2, 2) + ) + ) observed <- adonispost( - example_data_3groups, example_dist, distmat ~ study_group, + example_data_3groups, + example_dist, + distmat ~ study_group, which = study_group ) expected <- tibble::tibble( @@ -33,13 +91,22 @@ test_that("adonispost works", { term = c("study_group", "study_group", "study_group", "study_group"), df = c(2, 1, 1, 1), sumsq = c( - 0.396595356060606, 0.2534925, 0.172570726190476, 0.160944833333333 + 0.396595356060606, + 0.2534925, + 0.172570726190476, + 0.160944833333333 ), r.squared = c( - 0.2457711729374, 0.18721007197831, 0.162938895956797, 0.26470972004068 + 0.2457711729374, + 0.18721007197831, + 0.162938895956797, + 0.26470972004068 ), statistic = c( - 1.30343028067264, 1.38198123911777, 0.973279580007741, 1.80003549112144 + 1.30343028067264, + 1.38198123911777, + 0.973279580007741, + 1.80003549112144 ), p.value = c(0.154, 0.173, 0.478, 0.092) ) @@ -68,7 +135,9 @@ test_that("adonisplus fails if LHS is not 'distmat'", { test_that("adonisplus works for one group with restricted permutations", { observed <- adonisplus( - example_data, example_dist, distmat ~ study_group, + example_data, + example_dist, + distmat ~ study_group, rep_meas_var = SubjectID, shuffle = c(study_group = "between"), permutations = 9 @@ -89,27 +158,42 @@ test_that("adonisplus works for one group with restricted permutations", { test_that("adonisplus works for two groups", { observed <- adonisplus( - example_data, example_dist, distmat ~ study_group * time_point, + example_data, + example_dist, + distmat ~ study_group * time_point, rep_meas_var = SubjectID, shuffle = c(study_group = "between", time_point = "within"), permutations = 9 ) expected <- tibble::tibble( term = c( - "study_group", "time_point", "study_group:time_point", - "Residual", "Total" + "study_group", + "time_point", + "study_group:time_point", + "Residual", + "Total" ), df = c(1, 1, 1, 7, 10), sumsq = c( - 0.141236772727273, 0.2546555, 0.161871833333333, - 1.05591316666667, 1.61367727272727 + 0.141236772727273, + 0.2546555, + 0.161871833333333, + 1.05591316666667, + 1.61367727272727 ), r.squared = c( - 0.0875247951460386, 0.157810675222318, 0.100312395835974, - 0.654352133795669, 1 + 0.0875247951460386, + 0.157810675222318, + 0.100312395835974, + 0.654352133795669, + 1 ), statistic = c( - 0.936305598131642, 1.68819610956015, 1.07310228634646, NA, NA + 0.936305598131642, + 1.68819610956015, + 1.07310228634646, + NA, + NA ), p.value = c(0.4, 0.1, 0.3, NA, NA) ) @@ -118,28 +202,46 @@ test_that("adonisplus works for two groups", { test_that("adonisplus works for two groups with covariate", { observed <- adonisplus( - example_data, example_dist, distmat ~ age + study_group * time_point, + example_data, + example_dist, + distmat ~ age + study_group * time_point, rep_meas_var = SubjectID, shuffle = c(study_group = "between", time_point = "within"), permutations = 9 ) expected <- tibble::tibble( term = c( - "age", "study_group", "time_point", "study_group:time_point", - "Residual", "Total" + "age", + "study_group", + "time_point", + "study_group:time_point", + "Residual", + "Total" ), df = c(1, 1, 1, 1, 6, 10), sumsq = c( - 0.147625953372434, 0.12677620170778, 0.270223650980392, - 0.148155646153846, 0.920895820512821, 1.61367727272727 + 0.147625953372434, + 0.12677620170778, + 0.270223650980392, + 0.148155646153846, + 0.920895820512821, + 1.61367727272727 ), r.squared = c( - 0.0914841869978943, 0.0785635417009472, 0.167458298847878, - 0.0918124389912542, 0.570681533462026, 1 + 0.0914841869978943, + 0.0785635417009472, + 0.167458298847878, + 0.0918124389912542, + 0.570681533462026, + 1 ), statistic = c( - 0.961841394547052, 0.825997027354399, 1.76061381729312, - 0.965292552232516, NA, NA + 0.961841394547052, + 0.825997027354399, + 1.76061381729312, + 0.965292552232516, + NA, + NA ), p.value = c(0.7, 0.5, 0.1, 0.5, NA, NA) ) diff --git a/tests/testthat/test-farmm.R b/tests/testthat/test-farmm.R index 374d046..74f6858 100644 --- a/tests/testthat/test-farmm.R +++ b/tests/testthat/test-farmm.R @@ -1,9 +1,21 @@ test_that("farmm_samples data is available", { expect_equal(nrow(farmm_samples), 414) - expect_equal(colnames(farmm_samples), c( - "sample_id", "subject_id", "study_day", "diet", "antibiotics", "height", - "weight", "age", "bacterial_16S_copies", "num_reads", "host_frac" - )) + expect_equal( + colnames(farmm_samples), + c( + "sample_id", + "subject_id", + "study_day", + "diet", + "antibiotics", + "height", + "weight", + "age", + "bacterial_16S_copies", + "num_reads", + "host_frac" + ) + ) expect_equal(levels(farmm_samples$diet), c("Omnivore", "Vegan", "EEN")) expect_equal(levels(farmm_samples$antibiotics), c("pre", "current", "post")) }) diff --git a/tests/testthat/test-ordination.R b/tests/testthat/test-ordination.R index 9f9cbfa..c7b9670 100644 --- a/tests/testthat/test-ordination.R +++ b/tests/testthat/test-ordination.R @@ -5,7 +5,17 @@ ax <- function(x) { example_data <- tibble::tibble( SampleID = c( - "C1", "C2", "C3", "C4", "C5", "P1", "P2", "P3", "P4", "P5", "P6" + "C1", + "C2", + "C3", + "C4", + "C5", + "P1", + "P2", + "P3", + "P4", + "P5", + "P6" ), time_point = c(rep("C", 5), rep("P", 6)), SubjectID = paste0("S", c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6)), @@ -15,50 +25,138 @@ example_data <- tibble::tibble( example_dist <- structure( c( - 0.367, 0.495, 0.425, 0.432, 0.698, 0.812, 0.698, 0.605, 0.41, 0.522, 0.461, - 0.417, 0.411, 0.687, 0.809, 0.655, 0.618, 0.385, 0.47, 0.348, 0.233, 0.416, - 0.84, 0.472, 0.497, 0.34, 0.412, 0.393, 0.559, 0.781, 0.499, 0.484, 0.409, - 0.467, 0.474, 0.804, 0.598, 0.495, 0.257, 0.403, 0.82, 0.59, 0.586, 0.525, - 0.594, 0.877, 0.832, 0.794, 0.83, 0.498, 0.6, 0.556, 0.447, 0.483, 0.348 + 0.367, + 0.495, + 0.425, + 0.432, + 0.698, + 0.812, + 0.698, + 0.605, + 0.41, + 0.522, + 0.461, + 0.417, + 0.411, + 0.687, + 0.809, + 0.655, + 0.618, + 0.385, + 0.47, + 0.348, + 0.233, + 0.416, + 0.84, + 0.472, + 0.497, + 0.34, + 0.412, + 0.393, + 0.559, + 0.781, + 0.499, + 0.484, + 0.409, + 0.467, + 0.474, + 0.804, + 0.598, + 0.495, + 0.257, + 0.403, + 0.82, + 0.59, + 0.586, + 0.525, + 0.594, + 0.877, + 0.832, + 0.794, + 0.83, + 0.498, + 0.6, + 0.556, + 0.447, + 0.483, + 0.348 ), Labels = c("C1", "C2", "C3", "C4", "C5", "P1", "P2", "P3", "P4", "P5", "P6"), - Size = 11L, call = quote(as.dist.default(m = cp_dist)), class = "dist", - Diag = FALSE, Upper = FALSE + Size = 11L, + call = quote(as.dist.default(m = cp_dist)), + class = "dist", + Diag = FALSE, + Upper = FALSE ) expected_axes <- tibble::tibble( Axis.1 = c( - 0.0218046657139025, 0.0373054791505106, 0.13833146386329, - 0.0482957523422068, 0.0906680281431401, 0.0120057411305378, - -0.680446513436419, 0.0915777190805797, 0.0658719664029247, - 0.0777538535042316, 0.0968318441050968 + 0.0218046657139025, + 0.0373054791505106, + 0.13833146386329, + 0.0482957523422068, + 0.0906680281431401, + 0.0120057411305378, + -0.680446513436419, + 0.0915777190805797, + 0.0658719664029247, + 0.0777538535042316, + 0.0968318441050968 ), Axis.2 = c( - -0.303086502259418, -0.277649583508124, 0.0538409488164232, - -0.0371164252609219, -0.0685894632025572, 0.275689960626523, - 0.020089905908166, 0.306076031692592, 0.162663666052037, - -0.100614869652573, -0.0313036692121472 + -0.303086502259418, + -0.277649583508124, + 0.0538409488164232, + -0.0371164252609219, + -0.0685894632025572, + 0.275689960626523, + 0.020089905908166, + 0.306076031692592, + 0.162663666052037, + -0.100614869652573, + -0.0313036692121472 ), Axis.3 = c( - 0.0373672324641792, 0.0446548183955713, -0.106676969942398, - 0.0726191880827978, -0.148599519606932, -0.30153337102521, - 0.0100963735032305, 0.236709673732038, 0.169041261896952, - -0.0652297761452144, 0.0515510886449863 + 0.0373672324641792, + 0.0446548183955713, + -0.106676969942398, + 0.0726191880827978, + -0.148599519606932, + -0.30153337102521, + 0.0100963735032305, + 0.236709673732038, + 0.169041261896952, + -0.0652297761452144, + 0.0515510886449863 ) ) expected_nmds_axes <- tibble::tibble( MDS1 = c( - 0.836706003503475, -0.478138656124125, -0.873168624865947, - 0.831612773313092, -0.873168624865947, 1.12730524434323, - 0.347992717293982, 0.213938532476495, -0.476699598859632, - -0.873168624865126, 0.216788858650501 + 0.836706003503475, + -0.478138656124125, + -0.873168624865947, + 0.831612773313092, + -0.873168624865947, + 1.12730524434323, + 0.347992717293982, + 0.213938532476495, + -0.476699598859632, + -0.873168624865126, + 0.216788858650501 ), MDS2 = c( - 0.724394134805183, -1.0267096839492, 0.000665297749562208, - -0.72769854123764, 0.000665297749561982, -0.00467674105569537, - 0.00496749526862173, -1.0525703201631, 1.02721958016895, - 0.00066529774956238, 1.05307818291419 + 0.724394134805183, + -1.0267096839492, + 0.000665297749562208, + -0.72769854123764, + 0.000665297749561982, + -0.00467674105569537, + 0.00496749526862173, + -1.0525703201631, + 1.02721958016895, + 0.00066529774956238, + 1.05307818291419 ) ) From 36aa95615b10345c14a7db3318f39933ccbd9252 Mon Sep 17 00:00:00 2001 From: Kyle Bittinger Date: Mon, 6 Apr 2026 10:22:14 -0400 Subject: [PATCH 4/8] Fix linting errors --- R/adonis-custom.R | 19 ++++++++++++------- R/ordination.R | 18 ++++++++++++++---- R/shuffle.R | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/R/adonis-custom.R b/R/adonis-custom.R index bd57b99..7751ac2 100644 --- a/R/adonis-custom.R +++ b/R/adonis-custom.R @@ -35,8 +35,8 @@ adonisplus <- function( data, distmat, formula, - sample_id_var = SampleID, - rep_meas_var = subject_id, + sample_id_var = SampleID, # nolint: object_usage_linter. + rep_meas_var = subject_id, # nolint: object_usage_linter. shuffle = NULL, permutations = 999, seed = 42 @@ -122,13 +122,18 @@ adonisplus <- function( #' comparison. #' @return The results in tidy format. #' @export -adonispost <- function(data, ..., which = study_group, alpha = 0.05) { +adonispost <- function( + data, + ..., + which = study_group, # nolint: object_usage_linter. + alpha = 0.05 +) { var_name <- rlang::as_name(rlang::ensym(which)) result_main <- adonisplus(data, ...) |> dplyr::mutate(comparison = paste("All", var_name)) |> - dplyr::select(comparison, term, dplyr::everything()) |> - dplyr::filter(!(term %in% c("Residual", "Total"))) + dplyr::select(comparison, term, dplyr::everything()) |> # nolint + dplyr::filter(!(term %in% c("Residual", "Total"))) # nolint var_levels <- data |> dplyr::pull({{ which }}) |> @@ -141,8 +146,8 @@ adonispost <- function(data, ..., which = study_group, alpha = 0.05) { dplyr::filter({{ which }} %in% pair) adonisplus(pair_data, ...) |> dplyr::mutate(comparison = paste(pair, collapse = " - ")) |> - dplyr::select(comparison, term, dplyr::everything()) |> - dplyr::filter(!(term %in% c("Residual", "Total"))) + dplyr::select(comparison, term, dplyr::everything()) |> # nolint + dplyr::filter(!(term %in% c("Residual", "Total"))) # nolint } result_posthoc <- lapply(pairs, make_pairwise_comparison) |> dplyr::bind_rows() diff --git a/R/ordination.R b/R/ordination.R index d5a9afe..836585d 100644 --- a/R/ordination.R +++ b/R/ordination.R @@ -19,7 +19,12 @@ #' #' For \code{plot.pcoaplus}, a ggplot object. #' @export -pcoaplus <- function(data, distmat, sample_id_var = SampleID, num_axes = 2) { +pcoaplus <- function( + data, + distmat, + sample_id_var = SampleID, # nolint: object_usage_linter. + num_axes = 2 +) { num_axes <- as.integer(num_axes) stopifnot("num_axes must be 2 or more" = num_axes >= 2) axis_numbers <- 1:num_axes @@ -58,7 +63,7 @@ pcoaplus <- function(data, distmat, sample_id_var = SampleID, num_axes = 2) { plot.pcoaplus <- function(x, ...) { x |> ggplot2::ggplot() + - ggplot2::geom_point(ggplot2::aes(x = Axis.1, y = Axis.2, ...)) + + ggplot2::geom_point(ggplot2::aes(x = Axis.1, y = Axis.2, ...)) + # nolint ggplot2::coord_equal() + ggplot2::xlab(attr(x, "axislabel")[1]) + ggplot2::ylab(attr(x, "axislabel")[2]) @@ -83,7 +88,12 @@ plot.pcoaplus <- function(x, ...) { #' #' For \code{plot.nmdsplus}, a ggplot object. #' @export -nmdsplus <- function(data, distmat, sample_id_var = SampleID, num_axes = 2) { +nmdsplus <- function( + data, + distmat, + sample_id_var = SampleID, # nolint: object_usage_linter. + num_axes = 2 +) { num_axes <- as.integer(num_axes) stopifnot("num_axes must be 2 or more" = num_axes >= 2) @@ -113,5 +123,5 @@ nmdsplus <- function(data, distmat, sample_id_var = SampleID, num_axes = 2) { plot.nmdsplus <- function(x, ...) { x |> ggplot2::ggplot() + - ggplot2::geom_point(ggplot2::aes(x = MDS1, y = MDS2, ...)) + ggplot2::geom_point(ggplot2::aes(x = MDS1, y = MDS2, ...)) # nolint } diff --git a/R/shuffle.R b/R/shuffle.R index e2f23fd..4c0986b 100644 --- a/R/shuffle.R +++ b/R/shuffle.R @@ -24,7 +24,7 @@ shuffle_between_groups <- function(x, g) { g <- as.factor(g) x <- as.factor(x) # What is the value of x for every unique value of g? - x_vals_per_g <- tapply(x, g, unique, simplify = F) + x_vals_per_g <- tapply(x, g, unique, simplify = FALSE) # Check that x has one unique value for each value of g. If not, raise an # error with an informative message. if (!all(sapply(x_vals_per_g, length) == 1)) { From 2c814b83d6ee686e7f9c3c3b6041fdde898add25 Mon Sep 17 00:00:00 2001 From: Kyle Bittinger Date: Mon, 6 Apr 2026 13:40:26 -0400 Subject: [PATCH 5/8] Remove magrittr pipe import --- DESCRIPTION | 1 - NAMESPACE | 2 -- R/utils-pipe.R | 14 -------------- man/pipe.Rd | 20 -------------------- 4 files changed, 37 deletions(-) delete mode 100644 R/utils-pipe.R delete mode 100644 man/pipe.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 34fa544..f0bd4e4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -25,7 +25,6 @@ Imports: dplyr (>= 1.0.0), tibble (>= 3.0.0), ape, - magrittr, ggplot2, stringr Depends: diff --git a/NAMESPACE b/NAMESPACE index e08d9b4..3f8817e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,7 +4,6 @@ S3method(plot,nmdsplus) S3method(plot,pcoaplus) S3method(tidy,adonis) S3method(tidy,anova.cca) -export("%>%") export(adonisplus) export(adonispost) export(nmdsplus) @@ -13,4 +12,3 @@ export(shuffle_between_groups) export(shuffle_within_groups) export(tidy) importFrom(generics,tidy) -importFrom(magrittr,"%>%") diff --git a/R/utils-pipe.R b/R/utils-pipe.R deleted file mode 100644 index fd0b1d1..0000000 --- a/R/utils-pipe.R +++ /dev/null @@ -1,14 +0,0 @@ -#' Pipe operator -#' -#' See \code{magrittr::\link[magrittr:pipe]{\%>\%}} for details. -#' -#' @name %>% -#' @rdname pipe -#' @keywords internal -#' @export -#' @importFrom magrittr %>% -#' @usage lhs \%>\% rhs -#' @param lhs A value or the magrittr placeholder. -#' @param rhs A function call using the magrittr semantics. -#' @return The result of calling `rhs(lhs)`. -NULL diff --git a/man/pipe.Rd b/man/pipe.Rd deleted file mode 100644 index 1f8f237..0000000 --- a/man/pipe.Rd +++ /dev/null @@ -1,20 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/utils-pipe.R -\name{\%>\%} -\alias{\%>\%} -\title{Pipe operator} -\usage{ -lhs \%>\% rhs -} -\arguments{ -\item{lhs}{A value or the magrittr placeholder.} - -\item{rhs}{A function call using the magrittr semantics.} -} -\value{ -The result of calling `rhs(lhs)`. -} -\description{ -See \code{magrittr::\link[magrittr:pipe]{\%>\%}} for details. -} -\keyword{internal} From 678cdb7aa332107cfca8ecbe824533d58f559f15 Mon Sep 17 00:00:00 2001 From: Kyle Bittinger Date: Mon, 6 Apr 2026 14:32:13 -0400 Subject: [PATCH 6/8] Fix R CMD check note about no visible binding for global variable --- R/adonis-custom.R | 25 ++++++++++++++++++------- R/ordination.R | 10 ++++++---- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/R/adonis-custom.R b/R/adonis-custom.R index 7751ac2..c4f61b3 100644 --- a/R/adonis-custom.R +++ b/R/adonis-custom.R @@ -1,3 +1,5 @@ +utils::globalVariables(c("SampleID", "subject_id", "study_group", "term")) + #' Permutational multivariate analysis of variance, plus #' #' @param data Data to use in the test. @@ -35,8 +37,8 @@ adonisplus <- function( data, distmat, formula, - sample_id_var = SampleID, # nolint: object_usage_linter. - rep_meas_var = subject_id, # nolint: object_usage_linter. + sample_id_var = SampleID, + rep_meas_var = subject_id, shuffle = NULL, permutations = 999, seed = 42 @@ -125,15 +127,24 @@ adonisplus <- function( adonispost <- function( data, ..., - which = study_group, # nolint: object_usage_linter. + which = study_group, alpha = 0.05 ) { var_name <- rlang::as_name(rlang::ensym(which)) + result_cols <- c( + "comparison", + "term", + "df", + "sumsq", + "r.squared", + "statistic", + "p.value" + ) result_main <- adonisplus(data, ...) |> dplyr::mutate(comparison = paste("All", var_name)) |> - dplyr::select(comparison, term, dplyr::everything()) |> # nolint - dplyr::filter(!(term %in% c("Residual", "Total"))) # nolint + dplyr::select(dplyr::all_of(result_cols)) |> + dplyr::filter(!(term %in% c("Residual", "Total"))) var_levels <- data |> dplyr::pull({{ which }}) |> @@ -146,8 +157,8 @@ adonispost <- function( dplyr::filter({{ which }} %in% pair) adonisplus(pair_data, ...) |> dplyr::mutate(comparison = paste(pair, collapse = " - ")) |> - dplyr::select(comparison, term, dplyr::everything()) |> # nolint - dplyr::filter(!(term %in% c("Residual", "Total"))) # nolint + dplyr::select(dplyr::all_of(result_cols)) |> + dplyr::filter(!(term %in% c("Residual", "Total"))) } result_posthoc <- lapply(pairs, make_pairwise_comparison) |> dplyr::bind_rows() diff --git a/R/ordination.R b/R/ordination.R index 836585d..303df3d 100644 --- a/R/ordination.R +++ b/R/ordination.R @@ -1,3 +1,5 @@ +utils::globalVariables(c("Axis.1", "Axis.2", "MDS1", "MDS2")) + #' Principal coordinates analysis (PCoA), plus #' #' @param data A data frame giving information on the objects for the PCoA. @@ -22,7 +24,7 @@ pcoaplus <- function( data, distmat, - sample_id_var = SampleID, # nolint: object_usage_linter. + sample_id_var = SampleID, num_axes = 2 ) { num_axes <- as.integer(num_axes) @@ -63,7 +65,7 @@ pcoaplus <- function( plot.pcoaplus <- function(x, ...) { x |> ggplot2::ggplot() + - ggplot2::geom_point(ggplot2::aes(x = Axis.1, y = Axis.2, ...)) + # nolint + ggplot2::geom_point(ggplot2::aes(x = Axis.1, y = Axis.2, ...)) + ggplot2::coord_equal() + ggplot2::xlab(attr(x, "axislabel")[1]) + ggplot2::ylab(attr(x, "axislabel")[2]) @@ -91,7 +93,7 @@ plot.pcoaplus <- function(x, ...) { nmdsplus <- function( data, distmat, - sample_id_var = SampleID, # nolint: object_usage_linter. + sample_id_var = SampleID, num_axes = 2 ) { num_axes <- as.integer(num_axes) @@ -123,5 +125,5 @@ nmdsplus <- function( plot.nmdsplus <- function(x, ...) { x |> ggplot2::ggplot() + - ggplot2::geom_point(ggplot2::aes(x = MDS1, y = MDS2, ...)) # nolint + ggplot2::geom_point(ggplot2::aes(x = MDS1, y = MDS2, ...)) } From ceb2150130140db9f0cf32630b365c7d985f2b33 Mon Sep 17 00:00:00 2001 From: Kyle Bittinger Date: Mon, 6 Apr 2026 14:51:49 -0400 Subject: [PATCH 7/8] Update workflows --- .github/workflows/R-CMD-check.yaml | 97 +++++++++++++++------------- .github/workflows/linter.yaml | 54 ++++++++-------- .github/workflows/test-coverage.yaml | 92 +++++++++++++++++--------- README.Rmd | 4 +- README.md | 4 +- 5 files changed, 145 insertions(+), 106 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index c9ec15c..562fe0f 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -1,46 +1,51 @@ -# Workflow derived from https://github.com/r-lib/actions/tree/master/examples -# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help -on: - push: - branches: [main, master] - pull_request: - branches: [main, master] - -name: R-CMD-check - -jobs: - R-CMD-check: - runs-on: ${{ matrix.config.os }} - - name: ${{ matrix.config.os }} (${{ matrix.config.r }}) - - strategy: - fail-fast: false - matrix: - config: - - {os: macOS-latest, r: 'release'} - - {os: windows-latest, r: 'release'} - - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} - - {os: ubuntu-latest, r: 'release'} - - {os: ubuntu-latest, r: 'oldrel-1'} - - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - R_KEEP_PKG_SOURCE: yes - - steps: - - uses: actions/checkout@v4 - - - uses: r-lib/actions/setup-pandoc@v2 - - - uses: r-lib/actions/setup-r@v2 - with: - r-version: ${{ matrix.config.r }} - http-user-agent: ${{ matrix.config.http-user-agent }} - use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v2 - with: - extra-packages: rcmdcheck - - - uses: r-lib/actions/check-r-package@v2 +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + +name: R-CMD-check.yaml + +permissions: read-all + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: macos-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + + - uses: r-lib/actions/check-r-package@v2 + with: + upload-snapshots: true + build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' diff --git a/.github/workflows/linter.yaml b/.github/workflows/linter.yaml index ae78a83..ec7c257 100644 --- a/.github/workflows/linter.yaml +++ b/.github/workflows/linter.yaml @@ -1,26 +1,28 @@ -name: Super-Linter - -on: - pull_request: - branches: [ master, main ] - push: - branches: [ master, main ] - -jobs: - lint: - name: Lint Code Base - runs-on: ubuntu-latest - - steps: - - name: Checkout Code - uses: actions/checkout@v3 - - - name: Lint Code Base - uses: github/super-linter@v4 - env: - VALIDATE_ALL_CODEBASE: true - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - VALIDATE_R_LINTR: true - - FILTER_REGEX_INCLUDE: R/.*|tests/.*\.R +name: Super-Linter + +on: + pull_request: + branches: [ master, main ] + push: + branches: [ master, main ] + +jobs: + lint: + name: Lint Code Base + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + with: + # Super-Linter needs full git history to detect changed files + fetch-depth: 0 + + - name: Run Super-Linter + uses: [super-linter/super-linter@v7](https://github.com/marketplace/actions/super-linter) + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VALIDATE_ALL_CODEBASE: true + VALIDATE_R: true + DEFAULT_BRANCH: main + FILTER_REGEX_INCLUDE: R/.*|tests/.*\.R diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 38ddfe5..0ab748d 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -1,30 +1,62 @@ -# Workflow derived from https://github.com/r-lib/actions/tree/master/examples -# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help -on: - push: - branches: [main, master] - pull_request: - branches: [main, master] - -name: test-coverage - -jobs: - test-coverage: - runs-on: ubuntu-latest - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - - steps: - - uses: actions/checkout@v4 - - - uses: r-lib/actions/setup-r@v2 - with: - use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v2 - with: - extra-packages: covr - - - name: Test coverage - run: covr::codecov() - shell: Rscript {0} +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + +name: test-coverage.yaml + +permissions: read-all + +jobs: + test-coverage: + runs-on: ubuntu-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::covr, any::xml2 + needs: coverage + + - name: Test coverage + run: | + cov <- covr::package_coverage( + quiet = FALSE, + clean = FALSE, + install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package") + ) + print(cov) + covr::to_cobertura(cov) + shell: Rscript {0} + + - uses: codecov/codecov-action@v5 + with: + # Fail if error if not on PR, or if on PR and token is given + fail_ci_if_error: ${{ github.event_name != 'pull_request' || secrets.CODECOV_TOKEN }} + files: ./cobertura.xml + plugins: noop + disable_search: true + token: ${{ secrets.CODECOV_TOKEN }} + + - name: Show testthat output + if: always() + run: | + ## -------------------------------------------------------------------- + find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true + shell: bash + + - name: Upload test results + if: failure() + uses: actions/upload-artifact@v4 + with: + name: coverage-test-failures + path: ${{ runner.temp }}/package diff --git a/README.Rmd b/README.Rmd index cd125b6..15f328f 100644 --- a/README.Rmd +++ b/README.Rmd @@ -17,8 +17,8 @@ devtools::load_all() # adonisplus - [![R-CMD-check](https://github.com/PennChopMicrobiomeProgram/adonisplus/workflows/R-CMD-check/badge.svg)](https://github.com/PennChopMicrobiomeProgram/adonisplus/actions) - [![Codecov test coverage](https://codecov.io/gh/PennChopMicrobiomeProgram/adonisplus/branch/master/graph/badge.svg)](https://app.codecov.io/gh/PennChopMicrobiomeProgram/adonisplus?branch=master) +[![R-CMD-check](https://github.com/PennChopMicrobiomeProgram/adonisplus/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/PennChopMicrobiomeProgram/adonisplus/actions/workflows/R-CMD-check.yaml) +[![Codecov test coverage](https://codecov.io/gh/PennChopMicrobiomeProgram/adonisplus/graph/badge.svg)](https://app.codecov.io/gh/PennChopMicrobiomeProgram/adonisplus) The `adonisplus` package provides some utilities for permutational multivariate diff --git a/README.md b/README.md index b92eb77..8b67e53 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ -[![R-CMD-check](https://github.com/PennChopMicrobiomeProgram/adonisplus/workflows/R-CMD-check/badge.svg)](https://github.com/PennChopMicrobiomeProgram/adonisplus/actions) +[![R-CMD-check](https://github.com/PennChopMicrobiomeProgram/adonisplus/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/PennChopMicrobiomeProgram/adonisplus/actions/workflows/R-CMD-check.yaml) [![Codecov test -coverage](https://codecov.io/gh/PennChopMicrobiomeProgram/adonisplus/branch/master/graph/badge.svg)](https://app.codecov.io/gh/PennChopMicrobiomeProgram/adonisplus?branch=master) +coverage](https://codecov.io/gh/PennChopMicrobiomeProgram/adonisplus/graph/badge.svg)](https://app.codecov.io/gh/PennChopMicrobiomeProgram/adonisplus) The `adonisplus` package provides some utilities for permutational From 59578accfd8c5718b785d2074baa00ccff3c48f5 Mon Sep 17 00:00:00 2001 From: Kyle Bittinger Date: Mon, 6 Apr 2026 15:09:58 -0400 Subject: [PATCH 8/8] Fix linter workflow --- .github/workflows/linter.yaml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/linter.yaml b/.github/workflows/linter.yaml index ec7c257..27f2b44 100644 --- a/.github/workflows/linter.yaml +++ b/.github/workflows/linter.yaml @@ -1,28 +1,30 @@ -name: Super-Linter +name: Lint Code Base on: - pull_request: - branches: [ master, main ] push: - branches: [ master, main ] + branches: [main] + pull_request: + branches: [main] jobs: - lint: + run-lint: name: Lint Code Base runs-on: ubuntu-latest - steps: - name: Checkout Code uses: actions/checkout@v4 with: - # Super-Linter needs full git history to detect changed files + # Full git history is needed for Super-Linter to detect changed files fetch-depth: 0 - - name: Run Super-Linter - uses: [super-linter/super-linter@v7](https://github.com/marketplace/actions/super-linter) + - name: Super-Linter + uses: super-linter/super-linter@v7 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - VALIDATE_ALL_CODEBASE: true + # Enable only R linting (optional; defaults to all languages if omitted) VALIDATE_R: true + # Lint the entire codebase (true) or just changed files (false) + VALIDATE_ALL_CODEBASE: false + # Set the default branch (required for diff-based linting) DEFAULT_BRANCH: main FILTER_REGEX_INCLUDE: R/.*|tests/.*\.R