动态分支:将目标顺序定义为单个计划

dynamic branching: Define the order of targets into single plan

阅读 drake 包的文档,我发现没有其他方法可以在不使用 'file_in' 和 'file_out' 的情况下定义目标的顺序。

file_in() marks individual files (and whole directories) that your targets depend on.

file_out() marks individual files (and whole directories) that your targets create.

但是,不可能同时使用动态目标。

那么如何定义动态目标之间应遵循的顺序? 我也试过用make(plan, targets = c("ftp_list", "download.dbc", "dbc_list", "generate_parquet")),没用

例如,在下面的代码中,我有四个目标。我想要什么(订单):

  1. 从服务器获取ftp列表
  2. 从ftp列表中下载第一个文件(高清中的几个space全部下载)
  3. 获取下载的文件
  4. 转换为 .parquet(然后,重新开始。下载第二个文件,转换为 parquet...)

知道如何在不使用 file_in 和 file_out 的情况下 link 动态目标吗(在这种情况下不允许)? 谢谢!

代码如示例:

URL <- "ftp://ftp.url"
LOCAL_PATH <- paste0(getwd())

plan <- drake_plan(

  ftp_list = obtain_filenames_from_url(url_ = URL, 
                                       remove_extension_from_filename_ = FALSE,
                                       full_names = TRUE)[0:10],

  download.dbc = target(download_dbc(ftp_list, 
                                local_path = paste0(LOCAL_PATH, "/")), 
                   dynamic = map(ftp_list)),

  dbc_list = target(list.files(LOCAL_PATH, full.names = TRUE, 
                               pattern = "*.dbc")),

  generate_parquet = target(convert_dbc(dbc_list, delete_dbc_after_conversion = TRUE),  
                            dynamic = map(dbc_list))
)

计划图输出:

目标订单

file_in()file_out() 仅在您实际需要使用文件、目录或 URL 时才需要。 drake 目标是 R 对象,目标顺序由命令中提及目标的方式决定。 drake 使用 static code analysis 读取您的命令和函数以解析目标顺序。在下面的计划中,目标 abc 的顺序是任意的,但是 drake 以正确的顺序运行它们,因为这些符号是如何被提及的。

library(drake)

plan <- drake_plan(
  c = head(b),
  a = mtcars[, seq_len(3)],
  b = tail(a)
)

plot(plan)


make(plan)
#> target a
#> target b
#> target c

readd(c) # Targets are R objects
#>                 mpg cyl  disp
#> Porsche 914-2  26.0   4 120.3
#> Lotus Europa   30.4   4  95.1
#> Ford Pantera L 15.8   8 351.0
#> Ferrari Dino   19.7   6 145.0
#> Maserati Bora  15.0   8 301.0
#> Volvo 142E     21.4   4 121.0

reprex package (v0.3.0)

于 2020-02-07 创建

你的计划

以下是一些可以帮助您当前计划的事情。

  1. ftp://ftp.url 上使用 file_in() 来检测 ftp_list 何时应该更新。
  2. 定义一个函数(比如,get_dbc())来下载一些文件(ftp_list 的一部分)并将它们读入内存。
  3. 跳过转换为 Parquet。相反,return 数据帧作为子目标的值。然后,drake 将自动将这些数据帧存储在 fst 个文件中。

相关:

素描:

get_dbc_data_frame <- function(ftp_list_entry) {
  # 1. Download the files from the ftp_list_entry.
  # 2. Read them into memory.
  # 3. Return a data frame.
}

plan <- drake_plan(
  ftp_list = obtain_filenames_from_url(
    url_ = file_in("ftp://ftp.url"), 
    remove_extension_from_filename_ = FALSE,
    full_names = TRUE
  )[seq(0, 10)],
  dbc_data = target(
    get_dbc_data_frame(ftp_list, local_path = paste0(getwd(), "/")),
    format = "fst", # Tell drake to store the data frame as an fst file.
    dynamic = map(ftp_list)
  )
)