Пакет 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'

0 ответов

Другие вопросы по тегам