Я написал большую часть своего вопроса в виде комментариев в моем представлении. Я пытаюсь улучшить семантику моего кода и ответить на конкретный вопрос c относительно переменных в кавычках в качестве параметров функций, подобных замыканию.
library(tidyverse)
# A df of file-paths split so all basenames
# are in the same column, but parent-dirs
# are spread across an abritary number of columns
# and filled with NA's.
dat <- tibble(
ref01 = rep("analysis", 5),
ref02 = c(NA, NA, "next", "next", "next"),
ref03 = c(NA, NA, NA, NA, "last"),
target = c("analysis.test1", "analysis.test2",
"next.test3", "next.test4",
"last.test5")
)
# For example this reprex df shows file-paths
# from a file-tree that looks like:
# analysis
# ├── next
# │ ├── last
# │ │ └── last.test5
# │ ├── next.test3
# │ └── next.test4
# ├── analysis.test1
# └── analysis.test2
dat
#> # A tibble: 5 x 4
#> ref01 ref02 ref03 target
#> <chr> <chr> <chr> <chr>
#> 1 analysis <NA> <NA> analysis.test1
#> 2 analysis <NA> <NA> analysis.test2
#> 3 analysis next <NA> next.test3
#> 4 analysis next <NA> next.test4
#> 5 analysis next last last.test5
Эта функция очищает «целевые» тестовые базовые имена. Всем именам тестов предшествуют его имя «parent-dir» и точка. (например, 'last.test5')
Эта функция принимает столбец "target" и произвольное количество столбцов parent-dir. Он переворачивает список parent-dirs и находит первое не-NA значение. Затем он сопоставляет это значение с целевым значением и удаляет его.
Мой вопрос заключается в этой функции:
- Есть ли более semanti c способ построения этой функции, чтобы это может быть выражено внутри функции `mutate () '?
В настоящее время функция replace_pattern()
основана на том факте, что столбец .key
называется« target »и жестко закодирован как входной параметр.
Это связано с тем, что pmap работает, беря аргументы p-num из списка и сопоставляя аргументы с именами.
Поскольку я хочу, чтобы эта функция работала для сколь угодно глубоких путей к файлам Мне нужно найти способ обработки различных .key
имен.
Есть ли способ заключить в кавычки .key
переменную, чтобы это было имя первого параметра функции replace_pattern()
?
trim_target <- function(.tbl, .key, ...){
key <- tidyselect::eval_select(expr(c(!!enquo(.key))), .tbl)
loc <- tidyselect::eval_select(expr(c(...)), .tbl)
# First param has to be "target" since that's the name
# of the .key column.
replace_pattern <- function(target, ...){
args <- c(...)
pattern <- args %>%
rev() %>%
discard(is.na) %>%
first() %>%
paste0("\\.")
unlist(str_remove(target, pattern))
}
pmap(.tbl[,c(key, loc)], replace_pattern) %>%
unlist()
}
Ожидаемый результат: работает должным образом, но не масштабируется. Также, что касается вопроса 01, я должен передать dat
в вызов функции mutate()
; что я не вижу, как правило, сделано.
dat %>%
mutate(target = trim_target(dat, target, ref01:ref03))
#> # A tibble: 5 x 4
#> ref01 ref02 ref03 target
#> <chr> <chr> <chr> <chr>
#> 1 analysis <NA> <NA> test1
#> 2 analysis <NA> <NA> test2
#> 3 analysis next <NA> test3
#> 4 analysis next <NA> test4
#> 5 analysis next last test5
Создано в 2020-04-08 пакетом prepx (v0.3.0)