Пакет R {target}: как сослаться на существующую цель с помощью строки?
Я использую пакет, пытаясь создать новые цели на основе существующих целей. В то время как ссылаться на существующую цель просто, набрав ее имя в стиле NSE, я не могу сделать то же самое, используя символьную строку в качестве «псевдонима».
Просто чтобы прояснить, о чем я говорю. Сначала я покажу, что я имею в виду за пределами страны.
Если мы создадим объект данных, такой как:
my_vec <- 1:10
Мы можем получить его, набрав его имя без кавычек:
my_vec
#> [1] 1 2 3 4 5 6 7 8 9 10
или в виде строки, используя
get()
:
get("my_vec")
#> [1] 1 2 3 4 5 6 7 8 9 10
И если по какой-либо причине мы хотим использовать «псевдоним», когда мы его вызываем, одним из способов (из многих) может быть:
get_object_from_alias <- function(alias) {
switch(alias,
"the_1_to_10_vector" = get("my_vec"))
}
get_object_from_alias("the_1_to_10_vector")
#> [1] 1 2 3 4 5 6 7 8 9 10
Итак, чтобы подвести итог этому небольшому вступлению: я могу вызвать тот же объект непосредственно по его имени:
-
my_vec
; или -
get("my_vec")
Или косвенно используя его псевдоним
"the_1_to_10_vector"
с помощью
get_object_from_alias()
.
В
{targets}
контекст
Вот воспроизводимый пример. Нижняя строка, которая ясно передает мой вопрос, находится в конце.
1. Чтобы все было в порядке, давайте создадим новый проект R и загрузим Rstudio.
library(usethis)
usethis::create_project(path = "my_reproducible_project", open = TRUE, rstudio = TRUE)
2. Теперь мы должны оказаться в новом окне RStudio, являющемся частью
my_reproducible_project
.Rproj.
# install.packages("targets")
library(targets)
3. Откройте новый файл уценки R.
4. Следующие блоки настраивают файл и создают «цели».
---
title: "Target Markdown"
output: html_document
---
``{r setup, include = FALSE} knitr::opts_chunk$set(tar_interactive = FALSE, collapse = TRUE) ``''
# Настраивать ``{r} библиотека (цели) tar_unscript () ``'' # Целей ``{таргетинг на необработанные данные} библиотека (табл.) библиотека (magrittr) tar_target(raw_data, airquality%>% tibble::rowid_to_column("id")) ``'' ``{целевые обработанные-данные} библиотека (dplyr) список( tar_target(filter_data_ozone, raw_data%>% filter(!is.na(Ozone))), tar_target(filter_data_solar_r, raw_data%>% filter(!is.na(Solar.R))) ) ``'' # Трубопровод ``{r} tar_make() ``''
5. На этом этапе, если мы запустим приведенный выше код, он должен создать 3 цели:
-
raw_data
Они не находятся в окружающей среде, а сохраняются как
.rds
файлы в каталоге проекта. Мы можем перенести их в текущую среду, используя
tar_read()
. Не назначая их объектам, он просто выводит их на консоль:
# Чтение целей `filter_data_ *` ``{r} tar_read (отфильтрованные_данные_solar_r) tar_read (filter_data_ozone) ``''
Все идет нормально! Вот моя проблема.
Теперь я хочу создать новую цель, ссылаясь на
filtered_data_*
цели косвенно (как я с помощью «the_1_to_10_vector» псевдоним в начале этого поста).
В то время как прямой метод работает без проблем:
``{цели присоединяются к ним-напрямую-по-имени-цели} библиотека (dplyr) tar_target(объединенный_фильтрованный, внутреннее_сообщение (отфильтрованные_данные_solar_r, отфильтрованные_данные_ozone)) ``'' ``{r} tar_make() # теперь создаст новую цель с именем `connected_filtered`, которую мы можем вызвать с помощью tar_read ()`. ``''
Но используя "псевдонимы" для
filtered_data_solar_r
а также
filtered_data_ozone
не сработает!
Если мы определим служебную функцию для обмена псевдонимами:
swap_alias_for_real_target_name <- function(alias) {
switch(alias,
#aliases # targets actual names
"ozone_without_na" = "filtered_data_ozone",
"solar_r_without_na" = "filtered_data_solar_r")
}
swap_alias_for_real_target_name("ozone_without_na")
#> [1] "filtered_data_ozone"
swap_alias_for_real_target_name("solar_r_without_na")
#> [1] "filtered_data_solar_r"
Это не сработает, когда мы используем его внутри
tar_target()
, даже при преобразовании строки в символ.
``{target-join-them-by-utility-func-full-example} swap_alias_for_real_target_name = function(псевдоним) { переключатель (псевдоним, #aliases # нацелены на настоящие имена "ozone_without_na" = "filter_data_ozone", "solar_r_without_na" = "filter_data_solar_r") } tar_target(connected_filtered_full_example, inner_join(as.symbol(swap_alias_for_real_target_name("ozone_without_na")), as.symbol(swap_alias_for_real_target_name("solar_r_without_na")) ) ) ``'' ``{r} tar_make(присоединенный_filtered_full_example) ``''
Ошибка: не удалось выполнить подпроцесс callr: к объекту класса name не применен применимый метод для 'inner_join'