Объединение результатов вложенных вызовов tar_map
Я создаю конвейер, который позволяет вводить произвольное количество имен наборов данных, где все они будут проходить через аналогичные процессы очистки. Для этого я использую
targets
пакет и с помощью
tar_map
функция от
tarchetypes
, я подвергаю каждый набор данных ряду функций очистки и обработки.
Теперь моя проблема заключается в том, что один набор данных необходимо разделить на три набора данных с коэффициентом (а-ля
split
), а остальные должны оставаться нетронутыми. Затем конвейер теоретически будет двигаться дальше, обрабатывая каждый набор данных по отдельности, включая три «дочерних» набора данных.
Вот моя лучшая попытка:
library(targets)
library(tarchetypes)
library(tidyverse)
# dir.create("./data")
# tibble(nums = 1:300, groups = rep(letters[1:3], each = 100)) |>
# write_csv("./data/td1.csv")
# tibble(nums = 301:600, groups = rep(letters[1:3], each = 100)) |>
# write_csv("./data/td2.csv")
# tibble(nums = 601:900, groups = rep(letters[1:3], each = 100)) |>
# write_csv("./data/td3.csv")
tar_option_set(
packages = c("tidyverse")
)
read_data <- function(paths) {
read_csv(paths)
}
get_group <- function(data, groups) {
filter(data, groups == groups)
}
do_nothing <- function(data) {
data
}
list(
map1 <- tar_map(
values = tibble(datasets = c("./data/td1.csv", "./data/td2.csv", "./data/td3.csv")),
tar_target(data, read_data(datasets)),
map2 <- tar_map(values = tibble(groups = c("a", "b", "c")),
tar_skip(tester, get_group(data, groups), !str_detect(tar_name(), "td3\\.csv$"))
),
tar_target(dn, do_nothing(list(data, tester)))
)
)
Метод пропуска немного неуклюжий, я, возможно, тоже думаю об этом неправильно.
Я, очевидно, пытаюсь плохо комбинировать код в конце, помещая их в список, но я не знаю, что еще делать.
Наборы данных не могут быть объединены, скажем,
rbind
, так как на самом деле они
SummarizedExperiment
объекты.
Любая помощь приветствуется - дайте мне знать, если нужны какие-либо дополнительные разъяснения.
1 ответ
Если вы заранее знаете уровни этого фактора, вы можете справиться с разделением этого третьего набора данных с помощью отдельного
tar_map()
вызов похож на то, что вы делаете сейчас. Если вы заранее не знаете уровни факторов, то разделение необходимо обрабатывать с помощью динамического ветвления, и я рекомендую что-то вроде
tarchetypes::tar_group_by()
.
я так не думаю
tar_skip()
здесь имеет значение, и я рекомендую удалить его.
Если вы начинаете с физических файлов (или пишете физические файлы), я настоятельно рекомендую вам отслеживать их с помощью
format = "file"
: https://books.ropensci.org/targets/files.html#external-input-files.
library(targets)
library(tarchetypes)
tar_option_set(packages = "tidyverse")
list(
tar_map(
values = list(paths = c("data/td1.csv", "data/td2.csv")),
tar_target(file, paths, format = "file"),
tar_target(data, read_csv(file, col_types = cols()))
),
tar_target(file3, "data/td3.csv", format = "file"),
tar_group_by(data3, read_csv(file3, col_types = cols()), groups),
tar_target(
data3_row_counts,
tibble(group = data3$groups[1], n = nrow(data3)),
pattern = map(data3)
)
)