动态分支:将目标顺序定义为单个计划
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"))
,没用
例如,在下面的代码中,我有四个目标。我想要什么(订单):
- 从服务器获取ftp列表
- 从ftp列表中下载第一个文件(高清中的几个space全部下载)
- 获取下载的文件
- 转换为 .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 读取您的命令和函数以解析目标顺序。在下面的计划中,目标 a
、b
和 c
的顺序是任意的,但是 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 创建
你的计划
以下是一些可以帮助您当前计划的事情。
- 在
ftp://ftp.url
上使用 file_in()
来检测 ftp_list
何时应该更新。
- 定义一个函数(比如,
get_dbc()
)来下载一些文件(ftp_list
的一部分)并将它们读入内存。
- 跳过转换为 Parquet。相反,return 数据帧作为子目标的值。然后,
drake
将自动将这些数据帧存储在 fst
个文件中。
相关:
- https://books.ropensci.org/drake/plans.html#how-to-choose-good-targets
- https://books.ropensci.org/drake/plans.html#special-data-formats-for-targets
素描:
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)
)
)
阅读 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"))
,没用
例如,在下面的代码中,我有四个目标。我想要什么(订单):
- 从服务器获取ftp列表
- 从ftp列表中下载第一个文件(高清中的几个space全部下载)
- 获取下载的文件
- 转换为 .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 读取您的命令和函数以解析目标顺序。在下面的计划中,目标 a
、b
和 c
的顺序是任意的,但是 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 创建你的计划
以下是一些可以帮助您当前计划的事情。
- 在
ftp://ftp.url
上使用file_in()
来检测ftp_list
何时应该更新。 - 定义一个函数(比如,
get_dbc()
)来下载一些文件(ftp_list
的一部分)并将它们读入内存。 - 跳过转换为 Parquet。相反,return 数据帧作为子目标的值。然后,
drake
将自动将这些数据帧存储在fst
个文件中。
相关:
- https://books.ropensci.org/drake/plans.html#how-to-choose-good-targets
- https://books.ropensci.org/drake/plans.html#special-data-formats-for-targets
素描:
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)
)
)