Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/R-CMD-check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
R_KEEP_PKG_SOURCE: yes

steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6

- uses: r-lib/actions/setup-pandoc@v2

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/test-coverage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}

steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6

- uses: r-lib/actions/setup-r@v2
with:
Expand Down Expand Up @@ -56,7 +56,7 @@ jobs:

- name: Upload test results
if: failure()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: coverage-test-failures
path: ${{ runner.temp }}/package
7 changes: 3 additions & 4 deletions DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Description: Provides functionality to infer trajectories from single-cell data,
represent them into a common format, and adapt them. Other biological information
can also be added, such as cellular grouping, RNA velocity and annotation.
Saelens et al. (2019) <doi:10.1038/s41587-019-0071-9>.
Version: 1.2.5
Version: 1.3.0
Authors@R: c(
person(
"Robrecht",
Expand All @@ -26,11 +26,11 @@ URL: https://github.com/dynverse/dynwrap
BugReports: https://github.com/dynverse/dynwrap/issues
License: MIT + file LICENSE
LazyData: TRUE
RoxygenNote: 7.2.3
RoxygenNote: 7.3.3
Roxygen: list(markdown = TRUE)
Encoding: UTF-8
Depends:
R (>= 3.0.0)
R (>= 4.1.0)
Imports:
assertthat,
babelwhale,
Expand All @@ -40,7 +40,6 @@ Imports:
dynparam,
igraph,
glue,
magrittr,
Matrix,
methods,
purrr (>= 1.0.0),
Expand Down
4 changes: 0 additions & 4 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,6 @@ importFrom(igraph,graph_from_data_frame)
importFrom(igraph,is_directed)
importFrom(igraph,layout_with_fr)
importFrom(igraph,neighborhood)
importFrom(magrittr,"%$%")
importFrom(magrittr,"%<>%")
importFrom(magrittr,set_colnames)
importFrom(magrittr,set_rownames)
importFrom(methods,as)
importFrom(methods,formalArgs)
importFrom(methods,is)
Expand Down
18 changes: 18 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,21 @@
# dynwrap 1.3.0

* MODERNISATION: Replace `%>%` pipes with native `|>` pipe throughout.

* MODERNISATION: Remove `magrittr` dependency; replace `set_rownames()`/`set_colnames()` with base R assignments.

* MODERNISATION: Replace deprecated `dplyr::do()` with `reframe()`.

* MODERNISATION: Replace deprecated `mutate_at()` with `mutate(across())`.

* FIX: Add missing `"id"` to `globalVariables()` to silence R CMD check NOTE about no visible binding for global variable `id`.

* FIX: Replace relative cross-vignette URLs (`../create_ti_method_xxx`) with proper file-relative links to silence R CMD check NOTE.

* MINOR CHANGE: Update GitHub Actions workflows to use `actions/checkout@v6` and `actions/upload-artifact@v7`.

* MINOR CHANGE: Add `pkgdown.yaml` GitHub Actions workflow for website deployment.

# dynwrap 1.2.5

* BUG FIX `convert_definition()`: Fix for purrr having deprecated `invoke` in favour of `exec` (PR #166).
Expand Down
22 changes: 11 additions & 11 deletions R/adapt_orient_topology.R
Original file line number Diff line number Diff line change
Expand Up @@ -25,45 +25,45 @@ flip_edges <- function(
paste0(trajectory$milestone_network$from, trajectory$milestone_network$to)
), msg = "All edges in the milestone_network_toflip should also be present in the trajectory milestone network")

milestone_network_toflip <- milestone_network_toflip %>%
milestone_network_toflip <- milestone_network_toflip |>
select(from, to)

# flip edge if from is later than to
trajectory$milestone_network <- trajectory$milestone_network %>%
left_join(milestone_network_toflip %>% mutate(flip = TRUE), c("from", "to")) %>%
trajectory$milestone_network <- trajectory$milestone_network |>
left_join(milestone_network_toflip |> mutate(flip = TRUE), c("from", "to")) |>
mutate(flip = ifelse(is.na(flip), FALSE, flip))

# flip milestone network & progressions
trajectory$progressions <- trajectory$progressions %>%
left_join(trajectory$milestone_network %>% select(from, to, flip), c("from", "to")) %>%
trajectory$progressions <- trajectory$progressions |>
left_join(trajectory$milestone_network |> select(from, to, flip), c("from", "to")) |>
mutate(
from2 = from,
from = ifelse(flip, to, from),
to = ifelse(flip, from2, to),
percentage = ifelse(flip, 1-percentage, percentage)
) %>%
) |>
select(-flip, -from2)

if (!is.null(trajectory$dimred_segment_progressions)) {
trajectory$dimred_segment_progressions <-
trajectory$dimred_segment_progressions %>%
left_join(trajectory$milestone_network %>% select(from, to, flip), c("from", "to")) %>%
trajectory$dimred_segment_progressions |>
left_join(trajectory$milestone_network |> select(from, to, flip), c("from", "to")) |>
mutate(
from2 = from,
from = ifelse(flip, to, from),
to = ifelse(flip, from2, to),
percentage = ifelse(flip, 1-percentage, percentage)
) %>%
) |>
select(-flip, -from2)
}

trajectory$milestone_network <- trajectory$milestone_network %>%
trajectory$milestone_network <- trajectory$milestone_network |>
mutate(
from2 = from,
from = ifelse(flip, to, from),
to = ifelse(flip, from2, to),
directed = TRUE
) %>%
) |>
select(-flip, -from2)

trajectory
Expand Down
2 changes: 1 addition & 1 deletion R/add_regulatory_network.R
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ add_regulatory_network <- function(dataset, regulatory_network, regulatory_netwo
regulatory_network_sc$target <- factor(regulatory_network_sc$target, targets)
}

dataset <- dataset %>% extend_with(
dataset <- dataset |> extend_with(
"dynwrap::with_regulatory_network",
regulatory_network = regulatory_network,
regulatory_network_sc = regulatory_network_sc,
Expand Down
6 changes: 3 additions & 3 deletions R/calculate_average.R
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,16 @@
#' @rdname calculate_average
calculate_average_by_group <- function(x, cell_grouping) {
milestone_percentages <-
cell_grouping %>%
mutate(percentage = 1) %>%
cell_grouping |>
mutate(percentage = 1) |>
rename(milestone_id = group_id)

calculate_average_by_milestone_percentages(x, milestone_percentages)
}

calculate_average_by_milestone_percentages <- function(x, milestone_percentages) {
# cast milestone percentages to matrix
milpct_m <- milestone_percentages %>%
milpct_m <- milestone_percentages |>
reshape2::acast(cell_id ~ milestone_id, value.var = "percentage", fill = 0, fun.aggregate = sum)

stat <- colSums(milpct_m)
Expand Down
69 changes: 34 additions & 35 deletions R/calculate_geodesic_distances.R
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ calculate_geodesic_distances_ <- function(
waypoint_ids <- unique(c(waypoint_ids, waypoint_milestone_percentages$waypoint_id))
milestone_percentages <- bind_rows(
milestone_percentages,
waypoint_milestone_percentages %>% rename(cell_id = waypoint_id)
waypoint_milestone_percentages |> rename(cell_id = waypoint_id)
)
}

Expand All @@ -80,20 +80,19 @@ calculate_geodesic_distances_ <- function(

# rename milestones to avoid name conflicts between cells and milestones
milestone_trafo_fun <- function(x) paste0("MILESTONE_", x)
milestone_network <- milestone_network %>% mutate(from = milestone_trafo_fun(from), to = milestone_trafo_fun(to))
milestone_ids <- milestone_ids %>% milestone_trafo_fun()
milestone_percentages <- milestone_percentages %>% mutate(milestone_id = milestone_trafo_fun(milestone_id))
divergence_regions <- divergence_regions %>% mutate(milestone_id = milestone_trafo_fun(milestone_id))
milestone_network <- milestone_network |> mutate(from = milestone_trafo_fun(from), to = milestone_trafo_fun(to))
milestone_ids <- milestone_ids |> milestone_trafo_fun()
milestone_percentages <- milestone_percentages |> mutate(milestone_id = milestone_trafo_fun(milestone_id))
divergence_regions <- divergence_regions |> mutate(milestone_id = milestone_trafo_fun(milestone_id))

# add 'extra' divergences for transitions not in a divergence
extra_divergences <-
milestone_network %>%
# filter(from != to) %>% # filter self edges
rowwise() %>%
mutate(in_divergence = divergence_regions %>% group_by(divergence_id) %>% summarise(match = all(c(from, to) %in% milestone_id)) %>% {any(.$match)}) %>%
filter(!in_divergence) %>%
do({tibble(divergence_id = paste0(.$from, "__", .$to), milestone_id = c(.$from, .$to), is_start = c(T, F))}) %>%
ungroup() %>%
milestone_network |>
# filter(from != to) |> # filter self edges
rowwise() |>
mutate(in_divergence = divergence_regions |> group_by(divergence_id) |> summarise(match = all(c(from, to) %in% milestone_id)) |> (\(x) any(x$match))()) |>
filter(!in_divergence) |>
reframe(tibble(divergence_id = paste0(from, "__", to), milestone_id = c(from, to), is_start = c(TRUE, FALSE))) |>
distinct(divergence_id, milestone_id, .keep_all = TRUE)

divergence_regions <- bind_rows(
Expand All @@ -111,32 +110,32 @@ calculate_geodesic_distances_ <- function(
# calculate cell-cell distances for pairs of cells that are in the same transition, i.e. an edge or a divergence region
cell_in_tent_distances <-
map_df(divergence_ids, function(did) {
dir <- divergence_regions %>% filter(divergence_id == did)
mid <- dir %>% filter(is_start) %>% .$milestone_id
dir <- divergence_regions |> filter(divergence_id == did)
mid <- dir |> filter(is_start) |> pull(milestone_id)
tent <- dir$milestone_id

tent_nomid <- setdiff(tent, mid)
tent_distances <- igraph::distances(mil_gr, v = mid, to = tent, mode = "out", weights = igraph::E(mil_gr)$length)

relevant_pct <-
milestone_percentages %>%
group_by(cell_id) %>%
filter(all(milestone_id %in% tent)) %>%
milestone_percentages |>
group_by(cell_id) |>
filter(all(milestone_id %in% tent)) |>
ungroup()

if (nrow(relevant_pct) <= 1) {
return(NULL)
}

scaled_dists <-
relevant_pct %>%
relevant_pct |>
mutate(dist = percentage * tent_distances[mid, milestone_id])

pct_mat <-
bind_rows(
scaled_dists %>% select(from = cell_id, to = milestone_id, length = dist),
tent_distances %>% as.data.frame() %>% gather(from, length) %>% mutate(to = from)
) %>%
scaled_dists |> select(from = cell_id, to = milestone_id, length = dist),
tent_distances |> as.data.frame() |> gather(from, length) |> mutate(to = from)
) |>
reshape2::acast(from ~ to, value.var = "length", fill = 0)

wp_cells <- rownames(pct_mat)[rownames(pct_mat) %in% waypoint_ids]
Expand All @@ -150,7 +149,7 @@ calculate_geodesic_distances_ <- function(
if (!isFALSE(directed)) {
# calculate the sign of the distance
# distance is negative if the cell is closer to the beginning than the waypoint
begin <- dir %>% filter(is_start) %>% pull(milestone_id)
begin <- dir |> filter(is_start) |> pull(milestone_id)

signs <- sign(-outer(distances[, begin], distances[begin, ], "-"))
signs[is.na(signs)] <- 1 # when disconnected, sign will be NaN, so that distance remains + Inf
Expand All @@ -159,10 +158,10 @@ calculate_geodesic_distances_ <- function(
distances <- distances * signs
}

distances <- distances %>%
as.matrix() %>%
reshape2::melt(varnames = c("from", "to"), value.name = "length") %>%
mutate_at(c("from", "to"), as.character) %>%
distances <- distances |>
as.matrix() |>
reshape2::melt(varnames = c("from", "to"), value.name = "length") |>
mutate(across(c("from", "to"), as.character)) |>
filter(from != to)

distances
Expand All @@ -181,26 +180,26 @@ calculate_geodesic_distances_ <- function(
cell_in_tent_distances$from2,
cell_in_tent_distances$to
)
cell_in_tent_distances <- cell_in_tent_distances %>% select(-from2)
cell_in_tent_distances <- cell_in_tent_distances |> select(-from2)
cell_in_tent_distances$length <- abs(cell_in_tent_distances$length)

# add reverse edges if distance approx. zero
# this is necessary because the direction will be taken into account
cell_in_tent_distances <- bind_rows(
cell_in_tent_distances,
cell_in_tent_distances %>%
filter(length <= 1e-20) %>%
mutate(from2 = from, from = to, to = from2) %>%
cell_in_tent_distances |>
filter(length <= 1e-20) |>
mutate(from2 = from, from = to, to = from2) |>
select(-from2)
)
}

# combine all networks into one graph
gr <-
bind_rows(milestone_network, cell_in_tent_distances) %>%
group_by(from, to) %>%
summarise(length = min(length)) %>%
ungroup() %>%
bind_rows(milestone_network, cell_in_tent_distances) |>
group_by(from, to) |>
summarise(length = min(length)) |>
ungroup() |>
igraph::graph_from_data_frame(directed = directed, vertices = unique(c(milestone_ids, cell_ids_trajectory, waypoint_ids)))

# compute cell-to-cell distances across entire graph
Expand All @@ -209,7 +208,7 @@ calculate_geodesic_distances_ <- function(
directed == "reverse" ~ "in",
TRUE ~ "all"
)
out <- gr %>%
out <- gr |>
igraph::distances(
v = waypoint_ids,
to = cell_ids_trajectory,
Expand Down
Loading
Loading