繁体   English   中英

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

[英]dynamic branching: Define the order of targets into single plan

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

file_in() 标记目标所依赖的单个文件(和整个目录)。

file_out() 标记目标创建的单个文件(和整个目录)。

但是,不可能将两者与动态目标一起使用。

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

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

  1. 从服务器获取ftp列表
  2. 从 ftp 列表中下载第一个文件(hd 中的空间很少可以全部下载)
  3. 获取下载的文件
  4. 转换为 .parquet(然后重新开始。下载第二个文件,转换为 parquet...)

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

代码仅作为示例:

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通过静态代码分析读取您的命令和函数以解析目标顺序。 在下面的计划中,目标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 包(v0.3.0) 于 2020 年 2 月 7 日创建

你的计划

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

  1. ftp://ftp.url上使用file_in()来检测ftp_list应该更新。
  2. 定义一个函数(比如get_dbc() )来下载一些文件( ftp_list一部分)并将它们读入内存。
  3. 跳过转换为 Parquet。 相反,将数据帧作为子目标的值返回。 然后, 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)
  )
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM