0

阅读 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 列表中下载第一个文件(高清空间很少可以全部下载)
  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))
)

计划图输出:

在此处输入图像描述

4

1 回答 1

1

目标订单

file_in()并且file_out()仅在您实际需要处理文件、目录或 URL 时才需要。drake目标是 R 对象,目标顺序取决于命令中如何提及目标。通过静态代码分析drake读取您的命令和函数以解析目标顺序。在下面的计划中,目标、、和的顺序是任意的,但由于提到了符号的方式,它们以正确的顺序运行。abcdrake

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 包于 2020-02-07 创建(v0.3.0)

你的计划

这里有一些可以帮助您当前计划的事情。

  1. 使用file_in()onftp://ftp.url检测何时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)
  )
)
于 2020-02-07T20:58:33.743 回答