drake R 中多个子计划的最佳实践
Best practice for multiple subplans in drake R
您好,我是 drake
R 包的新手,想听听有关使用子任务管理大型项目的最佳实践的一些意见。我的项目的简化结构分为两部分:1) 数据清理和 2) 建模。从某种意义上说,它们是级联的,我首先进行数据清理,然后在开始建模部分时很少返回。
我认为手册建议的方法是:
source("functions_1.R") # for plan_1
plan1 <- drake_plan(
# many middle steps to create
foo = some_function()
foo_1 = fn_1(foo)
foo_2 = fn_2(foo_1)
for_analysis = data_cleaning_fn()
)
plan2 <- drake_plan(
# I would like to use the target name foo_1 again, but not the same object as they were defined in plan1.
# What I want:
# foo_1 = fn_new_1(for_analysis) # this is different from above defined
# result = model_fn(for_1)
# What I actually did
foo_new_1 = fn_new_1(for_analysis) # I have to define a new name different from foo_1
result = model_fn(foo_new_1)
)
fullplan <- bind_plans(plan1,plan2)
make(fullplan)
我在上述工作流程中遇到的一个问题是我为 plan1
定义了很多中间目标,但它们在 plan2
中没有用。
- 有没有一种方法可以让我在
plan2
中拥有一个“干净的名称空间”,这样我就可以摆脱无用的名称 foo_1
和 foo_2
等?这样我就可以在 plan2
中重复使用这些名称。我只想保留在 plan_2
中的是 for_analysis
.
- 有没有一种方法可以将
functions_1.R
中定义的函数仅用于 plan1
以及 functions_2.R
中定义的函数仅用于 plan2
?我希望每次都使用较小的函数集。
非常感谢!
有趣的问题。 drake
不支持计划中的多个命名空间。所有目标名称必须是唯一的,所有函数名称也必须是唯一的,因此如果要重用名称,则需要将这些计划一起放在单独的项目中。
您可能 运行 遇到定义过多目标的情况。从广义上讲,目标应该 (1) 为您的项目产生有意义的输出,或者 (2) 消耗足够的运行时间以便跳过它们可以节省您的时间。我推荐阅读 https://books.ropensci.org/drake/plans.html#how-to-choose-good-targets。要将多个目标压缩为一个目标,我建议将函数组合在一起。示例:
foo_all <- function()
# Each middle step is super quick, but all put together, they take up noticeable runtime.
foo <- some_function()
foo_1 <- fn_1(foo)
foo_2 <- fn_2(foo_1)
for_analysis = data_cleaning_fn()
)
plan1 <- drake_plan(
for_analysis = foo_all()
)
此外,drake
的分支机制是自动生成名称或避免过于费力地考虑名称的便捷方式。也许看看 https://books.ropensci.org/drake/static.html and https://books.ropensci.org/drake/dynamic.html.
您好,我是 drake
R 包的新手,想听听有关使用子任务管理大型项目的最佳实践的一些意见。我的项目的简化结构分为两部分:1) 数据清理和 2) 建模。从某种意义上说,它们是级联的,我首先进行数据清理,然后在开始建模部分时很少返回。
我认为手册建议的方法是:
source("functions_1.R") # for plan_1
plan1 <- drake_plan(
# many middle steps to create
foo = some_function()
foo_1 = fn_1(foo)
foo_2 = fn_2(foo_1)
for_analysis = data_cleaning_fn()
)
plan2 <- drake_plan(
# I would like to use the target name foo_1 again, but not the same object as they were defined in plan1.
# What I want:
# foo_1 = fn_new_1(for_analysis) # this is different from above defined
# result = model_fn(for_1)
# What I actually did
foo_new_1 = fn_new_1(for_analysis) # I have to define a new name different from foo_1
result = model_fn(foo_new_1)
)
fullplan <- bind_plans(plan1,plan2)
make(fullplan)
我在上述工作流程中遇到的一个问题是我为 plan1
定义了很多中间目标,但它们在 plan2
中没有用。
- 有没有一种方法可以让我在
plan2
中拥有一个“干净的名称空间”,这样我就可以摆脱无用的名称foo_1
和foo_2
等?这样我就可以在plan2
中重复使用这些名称。我只想保留在plan_2
中的是for_analysis
. - 有没有一种方法可以将
functions_1.R
中定义的函数仅用于plan1
以及functions_2.R
中定义的函数仅用于plan2
?我希望每次都使用较小的函数集。
非常感谢!
有趣的问题。 drake
不支持计划中的多个命名空间。所有目标名称必须是唯一的,所有函数名称也必须是唯一的,因此如果要重用名称,则需要将这些计划一起放在单独的项目中。
您可能 运行 遇到定义过多目标的情况。从广义上讲,目标应该 (1) 为您的项目产生有意义的输出,或者 (2) 消耗足够的运行时间以便跳过它们可以节省您的时间。我推荐阅读 https://books.ropensci.org/drake/plans.html#how-to-choose-good-targets。要将多个目标压缩为一个目标,我建议将函数组合在一起。示例:
foo_all <- function() # Each middle step is super quick, but all put together, they take up noticeable runtime. foo <- some_function() foo_1 <- fn_1(foo) foo_2 <- fn_2(foo_1) for_analysis = data_cleaning_fn() ) plan1 <- drake_plan( for_analysis = foo_all() )
此外,drake
的分支机制是自动生成名称或避免过于费力地考虑名称的便捷方式。也许看看 https://books.ropensci.org/drake/static.html and https://books.ropensci.org/drake/dynamic.html.