- In
drake
7.0.0, if you runmake()
in interactive mode and respond to the menu prompt with an option other than1
or2
, targets will still build.
- Add a new
use_drake()
function to write themake.R
and_drake.R
files from the main example. Does not write other supporting scripts.
- Improve
drake_ggraph()
: hide node labels by default and render the arrows behind the nodes. - Print an informative error message when the user supplies a
drake
plan to theconfig
argument of a function.
- The enhancements that increase cache access speed also invalidate targets in old projects. Workflows built with drake <= 6.2.1 will need to run from scratch again.
- In
drake
plans, thecommand
andtrigger
columns are now lists of language objects instead of character vectors.make()
and friends still work if you have character columns, but the default output ofdrake_plan()
has changed to this new format. - All parallel backends (
parallelism
argument ofmake()
) except "clustermq" and "future" are removed. A new "loop" backend covers local serial execution. - A large amount of deprecated functionality is now defunct, including several functions (
built()
,find_project()
,imported()
, andparallel_stages()
; full list here) and the single-quoted file API. - Set the default value of
lock_envir
toTRUE
inmake()
anddrake_config()
. Somake()
will automatically quit in error if the act of building a target tries to change upstream dependencies. make()
no longer returns a value. Users will need to calldrake_config()
separately to get the old return value ofmake()
.- Require the
jobs
argument to be of length 1 (make()
anddrake_config()
). To parallelize the imports and other preprocessing steps, usejobs_preprocess
, also of length 1. - Get rid of the "kernels"
storr
namespace. As a result,drake
is faster, but users will no longer be able to load imported functions usingloadd()
orreadd()
. - In
target()
, users must now explicitly name all the arguments exceptcommand
, e.g.target(f(x), trigger = trigger(condition = TRUE))
instead oftarget(f(x), trigger(condition = TRUE))
. - Fail right away in
bind_plans()
when the result has duplicated target names. This makesdrake
's API more predictable and helps users catch malformed workflows earlier. loadd()
only loads targets listed in the plan. It no longer loads imports or file hashes.- The return values of
progress()
,deps_code()
,deps_target()
, andpredict_workers()
are now data frames. - Change the default value of
hover
toFALSE
in visualization functions. Improves speed.
- Allow
bind_plans()
to work with lists of plans (bind_plans(list(plan1, plan2))
was returningNULL
indrake
6.2.0 and 6.2.1). - Ensure that
get_cache(path = "non/default/path", search = FALSE)
looks for the cache in"non/default/path"
instead ofgetwd()
. - Remove strict dependencies on package
tibble
. - Pass the correct data structure to
ensure_loaded()
inmeta.R
andtriggers.R
when ensuring the dependencies of thecondition
andchange
triggers are loaded. - Require a
config
argument todrake_build()
andloadd(deps = TRUE)
.
- Introduce a new experimental domain-specific language for generating large plans (#233). Details here.
- Implement a
lock_envir
argument to safeguard reproducibility. See this thread for a demonstration of the problem solved bymake(lock_envir = TRUE)
. More discussion: #619, #620. - The new
from_plan()
function allows the users to reference custom plan columns from within commands. Changes to values in these columns columns do not invalidate targets. - Add a menu prompt (ropensci#762) to safeguard against
make()
pitfalls in interactive mode (ropensci#761). Appears once per session. Disable withoptions(drake_make_menu = FALSE)
. - Add new API functions
r_make()
,r_outdated()
, etc. to rundrake
functions more reproducibly in a clean session. See the help file ofr_make()
for details. progress()
gains aprogress
argument for filtering results. For example,progress(progress = "failed")
will report targets that failed.
- Large speed boost: move away from
storr
's key mangling in favor ofdrake
's own encoding of file paths and namespaced functions forstorr
keys. - Exclude symbols
.
,..
, and.gitignore
from being target names (consequence of the above). - Use only one hash algorithm per
drake
cache, which the user can set with thehash_algorithm
argument ofnew_cache()
,storr::storr_rds()
, and various other cache functions. Thus, the concepts of a "short hash algorithm" and "long hash algorithm" are deprecated, and the functionslong_hash()
,short_hash()
,default_long_hash_algo()
,default_short_hash_algo()
, andavailable_hash_algos()
are deprecated. Caches are still back-compatible withdrake
> 5.4.0 and <= 6.2.1. - Allow the
magrittr
dot symbol to appear in some commands sometimes. - Deprecate the
fetch_cache
argument in all functions. - Remove packages
DBI
andRSQLite
from "Suggests". - Define a special
config$eval <- new.env(parent = config$envir)
for storing built targets and evaluating commands in the plan. Now,make()
no longer modifies the user's environment. This move is a long-overdue step toward purity. - Remove dependency on the
codetools
package. - Deprecate and remove the
session
argument ofmake()
anddrake_config()
. Details: ropensci#623 (comment). - Deprecate the
graph
andlayout
arguments tomake()
anddrake_config()
. The change simplifies the internals, and memoization allows us to do this. - Warn the user if running
make()
in a subdirectory of thedrake
project root (determined by the location of the.drake
folder in relation to the working directory). - In the code analysis, explicitly prohibit targets from being dependencies of imported functions.
- Increase options for the
verbose
argument, including the option to print execution and total build times. - Separate the building of targets from the processing of imports. Imports are processed with rudimentary staged parallelism (
mclapply()
orparLapply()
, depending on the operating system). - Ignore the imports when it comes to build times. Functions
build_times()
,predict_runtime()
, etc. focus on only the targets. - Deprecate many API functions, including
plan_analyses()
,plan_summaries()
,analysis_wildcard()
,cache_namespaces()
,cache_path()
,check_plan()
,dataset_wildcard()
,drake_meta()
,drake_palette()
,drake_tip()
,recover_cache()
,cleaned_namespaces()
,target_namespaces()
,read_drake_config()
,read_drake_graph()
, andread_drake_plan()
. - Deprecate
target()
as a user-side function. From now on, it should only be called from withindrake_plan()
. drake_envir()
now throws an error, not a warning, if called in the incorrect context. Should be called only inside commands in the user'sdrake
plan.- Replace
*expr*()
rlang
functions with their*quo*()
counterparts. We still keeprlang::expr()
in the few places where we know the expressions need to be evaluated inconfig$eval
. - The
prework
argument tomake()
anddrake_config()
can now be an expression (language object) or list of expressions. Character vectors are still acceptable. - At the end of
make()
, print messages about triggers etc. only ifverbose >= 2L
. - Deprecate and rename
in_progress()
torunning()
. - Deprecate and rename
knitr_deps()
todeps_knitr()
. - Deprecate and rename
dependency_profile()
todeps_profile()
. - Deprecate and rename
predict_load_balancing()
topredict_workers()
. - Deprecate
this_cache()
and defer toget_cache()
andstorr::storr_rds()
for simplicity. - Change the default value of
hover
toFALSE
in visualization functions. Improves speed. Also a breaking change. - Deprecate
drake_cache_log_file()
. We recommend usingmake()
with thecache_log_file
argument to create the cache log. This way ensures that the log is always up to date withmake()
results.
Version 6.2.1 is a hotfix to address the failing automated CRAN checks for 6.2.0. Chiefly, in CRAN's Debian R-devel (2018-12-10) check platform, errors of the form "length > 1 in coercion to logical" occurred when either argument to &&
or ||
was not of length 1 (e.g. nzchar(letters) && length(letters)
). In addition to fixing these errors, version 6.2.1 also removes a problematic link from the vignette.
- Add a
sep
argument togather_by()
,reduce_by()
,reduce_plan()
,evaluate_plan()
,expand_plan()
,plan_analyses()
, andplan_summaries()
. Allows the user to set the delimiter for generating new target names. - Expose a
hasty_build
argument tomake()
anddrake_config()
. Here, the user can set the function that builds targets in "hasty mode" (make(parallelism = "hasty")
). - Add a new
drake_envir()
function that returns the environment wheredrake
builds targets. Can only be accessed from inside the commands in the workflow plan data frame. The primary use case is to allow users to remove individual targets from memory at predetermined build steps.
- Ensure compatibility with
tibble
2.0.0. - Stop returning
0s
frompredict_runtime(targets_only = TRUE)
when some targets are outdated and others are not. - Remove
sort(NULL)
warnings fromcreate_drake_layout()
. (Affects R-3.3.x.)
- Remove strict dependencies on packages
evaluate
,formatR
,fs
,future
,parallel
,R.utils
,stats
, andstringi
. - Large speed boost: reduce repeated calls to
parse()
incode_dependencies()
. - Large speed boost: change the default value of
memory_strategy
(previouslypruning_strategy
) to"speed"
(previously"lookahead"
). - Compute a special data structure in
drake_config()
(config$layout
) just to store the code analysis results. This is an intermediate structure between the workflow plan data frame and the graph. It will help clean up the internals in future development. - Improve memoized preprocessing: deparse all the functions in the environment so the memoization does not react so spurious changes in R internals. Related: #345.
- Use the
label
argument tofuture()
insidemake(parallelism = "future")
. That way , job names are target names by default ifjob.name
is used correctly in thebatchtools
template file. - Remove strict dependencies on packages
dplyr
,evaluate
,fs
,future
,magrittr
,parallel
,R.utils
,stats
,stringi
,tidyselect
, andwithr
. - Remove package
rprojroot
from "Suggests". - Deprecate the
force
argument in all functions exceptmake()
anddrake_config()
. - Change the name of
prune_envir()
tomanage_memory()
. - Deprecate and rename the
pruning_strategy
argument tomemory_strategy
(make()
anddrake_config()
). - Print warnings and messages to the
console_log_file
in real time (#588). - Use HTML line breaks in
vis_drake_graph()
hover text to display commands in thedrake
plan more elegantly. - Speed up
predict_load_balancing()
and remove its reliance on internals that will go away in 2019 via #561. - Remove support for the
worker
column ofconfig$plan
inpredict_runtime()
andpredict_load_balancing()
. This functionality will go away in 2019 via #561. - Change the names of the return value of
predict_load_balancing()
totime
andworkers
. - Bring the documentation of
predict_runtime()
andpredict_load_balancing()
up to date. - Deprecate
drake_session()
and rename todrake_get_session_info()
. - Deprecate the
timeout
argument in the API ofmake()
anddrake_config()
. A value oftimeout
can be still passed to these functions without error, but only theelapsed
andcpu
arguments impose actual timeouts now.
- Add a new
map_plan()
function to easily create a workflow plan data frame to execute a function call over a grid of arguments. - Add a new
plan_to_code()
function to turndrake
plans into generic R scripts. New users can use this function to better understand the relationship between plans and code, and unsatisfied customers can use it to disentangle their projects fromdrake
altogether. Similarly,plan_to_notebook()
generates an R notebook from adrake
plan. - Add a new
drake_debug()
function to run a target's command in debug mode. Analogous todrake_build()
. - Add a
mode
argument totrigger()
to control how thecondition
trigger factors into the decision to build or skip a target. See the?trigger
for details. - Add a new
sleep
argument tomake()
anddrake_config()
to help the master process consume fewer resources during parallel processing. - Enable the
caching
argument for the"clustermq"
and"clustermq_staged"
parallel backends. Now,make(parallelism = "clustermq", caching = "master")
will do all the caching with the master process, andmake(parallelism = "clustermq", caching = "worker")
will do all the caching with the workers. The same is true forparallelism = "clustermq_staged"
. - Add a new
append
argument togather_plan()
,gather_by()
,reduce_plan()
, andreduce_by()
. Theappend
argument control whether the output includes the originalplan
in addition to the newly generated rows. - Add new functions
load_main_example()
,clean_main_example()
, andclean_mtcars_example()
. - Add a
filter
argument togather_by()
andreduce_by()
in order to restrict what we gather even whenappend
isTRUE
. - Add a hasty mode:
make(parallelism = "hasty")
skips all ofdrake
's expensive caching and checking. All targets run every single time and you are responsible for saving results to custom output files, but almost all the by-target overhead is gone.
- Ensure commands in the plan are re-analyzed for dependencies when new imports are added (ropensci#548). Was a bug in version 6.0.0 only.
- Call
path.expand()
on thefile
argument torender_drake_graph()
andrender_sankey_drake_graph()
. That way, tildes in file paths no longer interfere with the rendering of static image files. Compensates for https://github.com/wch/webshot. - Skip tests and examples if the required "Suggests" packages are not installed.
- Stop checking for non-standard columns. Previously, warnings about non-standard columns were incorrectly triggered by
evaluate_plan(trace = TRUE)
followed byexpand_plan()
,gather_plan()
,reduce_plan()
,gather_by()
, orreduce_by()
. The more relaxed behavior also gives users more options about how to construct and maintain their workflow plan data frames. - Use checksums in
"future"
parallelism to make sure files travel over network file systems before proceeding to downstream targets. - Refactor and clean up checksum code.
- Skip more tests and checks if the optional
visNetwork
package is not installed.
- Stop earlier in
make_targets()
if all the targets are already up to date. - Improve the documentation of the
seed
argument inmake()
anddrake_config()
. - Set the default
caching
argument ofmake()
anddrake_config()
to"master"
rather than"worker"
. The default option should be the lower-overhead option for small workflows. Users have the option to make a different set of tradeoffs for larger workflows. - Allow the
condition
trigger to evaluate to non-logical values as long as those values can be coerced to logicals. - Require that the
condition
trigger evaluate to a vector of length 1. - Keep non-standard columns in
drake_plan_source()
. make(verbose = 4)
now prints to the console when a target is stored.gather_by()
andreduce_by()
now gather/reduce everything if no columns are specified.- Change the default parallelization of the imports. Previously,
make(jobs = 4)
was equivalent tomake(jobs = c(imports = 4, targets = 4))
. Now,make(jobs = 4)
is equivalent tomake(jobs = c(imports = 1, targets = 4))
. See issue 553 for details. - Add a console message for building the priority queue when
verbose
is at least 2. - Condense
load_mtcars_example()
. - Deprecate the
hook
argument ofmake()
anddrake_config()
. - In
gather_by()
andreduce_by()
, do not exclude targets with allNA
gathering variables.
- Avoid serialization in
digest()
wherever possible. This puts olddrake
projects out of date, but it improves speed. - Require R version >= 3.3.0 rather than >= 3.2.0. Tests and checks still run fine on 3.3.0, but the required version of the
stringi
package no longer compiles on 3.2.0. - Be more discerning in detecting dependencies. In
code_dependencies()
, restrict the possible global variables to the ones mentioned in the newglobals
argument (turned off whenNULL
. In practical workflows, global dependencies are restricted to items inenvir
and proper targets in the plan. Indeps_code()
, theglobals
slot of the output list is now a list of candidate globals, not necessarily actual globals (some may not be targets or variables inenvir
).
- In the call to
unlink()
inclean()
, setrecursive
andforce
toFALSE
. This should prevent the accidental deletion of whole directories. - Previously,
clean()
deleted input-only files if no targets from the plan were cached. A patch and a unit test are included in this release. loadd(not_a_target)
no longer loads every target in the cache.- Exclude each target from its own dependency metadata in the "deps"
igraph
vertex attribute (fixes ropensci#503). - Detect inline code dependencies in
knitr_in()
file code chunks. - Remove more calls to
sort(NULL)
that caused warnings in R 3.3.3. - Fix a bug on R 3.3.3 where
analyze_loadd()
was sometimes quitting with "Error: attempt to set an attribute on NULL". - Do not call
digest::digest(file = TRUE)
on directories. Instead, set hashes of directories toNA
. Users should still not directories as file dependencies. - If files are declared as dependencies of custom triggers ("condition" and "change") include them in
vis_drake_graph()
. Previously, these files were missing from the visualization, but actual workflows worked just fine. Ref: https://stackoverflow.com/questions/52121537/trigger-notification-from-report-generation-in-r-drake-package - Work around mysterious
codetools
failures in R 3.3 (add atryCatch()
statement infind_globals()
).
- Add a proper
clustermq
-based parallel backend:make(parallelism = "clustermq")
. evaluate_plan(trace = TRUE)
now adds a*_from
column to show the origins of the evaluated targets. Tryevaluate_plan(drake_plan(x = rnorm(n__), y = rexp(n__)), wildcard = "n__", values = 1:2, trace = TRUE)
.- Add functions
gather_by()
andreduce_by()
, which gather on custom columns in the plan (or columns generated byevaluate_plan(trace = TRUE)
) and append the new targets to the previous plan. - Expose the
template
argument ofclustermq
functions (e.g.Q()
andworkers()
) as an argument ofmake()
anddrake_config()
. - Add a new
code_to_plan()
function to turn R scripts and R Markdown reports into workflow plan data frames. - Add a new
drake_plan_source()
function, which generates lines of code for adrake_plan()
call. Thisdrake_plan()
call produces the plan passed todrake_plan_source()
. The main purpose is visual inspection (we even have syntax highlighting viaprettycode
) but users may also save the output to a script file for the sake of reproducibility or simple reference. - Deprecate
deps_targets()
in favor of a newdeps_target()
function (singular) that behaves more likedeps_code()
.
- Smooth the edges in
vis_drake_graph()
andrender_drake_graph()
. - Make hover text slightly more readable in in
vis_drake_graph()
andrender_drake_graph()
. - Align hover text properly in
vis_drake_graph()
using the "title" node column. - Optionally collapse nodes into clusters with
vis_drake_graph(collapse = TRUE)
. - Improve
dependency_profile()
show major trigger hashes side-by-side to tell the user if the command, a dependency, an input file, or an output file changed since the lastmake()
. - Choose more appropriate places to check that the
txtq
package is installed. - Improve the help files of
loadd()
andreadd()
, giving specific usage guidance in prose. - Memoize all the steps of
build_drake_graph()
and print to the console the ones that execute. - Skip some tests if
txtq
is not installed.
- Overhaul the interface for triggers and add new trigger types ("condition" and "change").
- Offload
drake
's code examples to this repository and make makedrake_example()
anddrake_examples()
download examples from there. - Optionally show output files in graph visualizations. See the
show_output_files
argument tovis_drake_graph()
and friends. - Repair output file checksum operations for distributed backends like
"clustermq_staged"
and"future_lapply"
. - Internally refactor the
igraph
attributes of the dependency graph to allow for smarter dependency/memory management duringmake()
. - Enable
vis_drake_graph()
andsankey_drake_graph()
to save static image files viawebshot
. - Deprecate
static_drake_graph()
andrender_static_drake_graph()
in favor ofdrake_ggraph()
andrender_drake_ggraph()
. - Add a
columns
argument toevaluate_plan()
so users can evaluate wildcards in columns other than thecommand
column ofplan
. - Name the arguments of
target()
so users do not have to (explicitly). - Lay the groundwork for a special pretty print method for workflow plan data frames.
- Allow multiple output files per command.
- Add Sankey diagram visuals:
sankey_drake_graph()
andrender_sankey_drake_graph()
. - Add
static_drake_graph()
andrender_static_drake_graph()
forggplot2
/ggraph
static graph visualizations. - Add
group
andclusters
arguments tovis_drake_graph()
,static_drake_graph()
, anddrake_graph_info()
to optionally condense nodes into clusters. - Implement a
trace
argument toevaluate_plan()
to optionally add indicator columns to show which targets got expanded/evaluated with which wildcard values. - Rename the
always_rename
argument torename
inevaluate_plan()
. - Add a
rename
argument toexpand_plan()
. - Implement
make(parallelism = "clustermq_staged")
, aclustermq
-based staged parallelism backend (see ropensci#452). - Implement
make(parallelism = "future_lapply_staged")
, afuture
-based staged parallelism backend (see ropensci#450). - Depend on
codetools
rather thanCodeDepends
for finding global variables. - Detect
loadd()
andreadd()
dependencies inknitr
reports referenced withknitr_in()
inside imported functions. Previously, this feature was only available in explicitknitr_in()
calls in commands. - Skip more tests on CRAN. White-list tests instead of blacklisting them in order to try to keep check time under the official 10-minute cap.
- Disallow wildcard names to grep-match other wildcard names or any replacement values. This will prevent careless mistakes and confusion when generating
drake_plan()
s. - Prevent persistent workers from hanging when a target fails.
- Move the example template files here.
- Deprecate
drake_batchtools_tmpl_file()
in favor ofdrake_hpc_template_file()
anddrake_hpc_template_files()
. - Add a
garbage_collection
argument tomake()
. IfTRUE
,gc()
is called after every new build of a target. - Remove redundant calls to
sanitize_plan()
inmake()
. - Change
tracked()
to accept only adrake_config()
object as an argument. Yes, it is technically a breaking change, but it is only a small break, and it is the correct API choice. - Move visualization and hpc package dependencies to "Suggests:" rather than "Imports:" in the
DESCRIPTION
file. - Allow processing of codeless
knitr
reports without warnings.
- Skip several long-running and low-priority tests on CRAN.
- Sequester staged parallelism in backends "mclapply_staged" and "parLapply_staged". For the other
lapply
-like backends,drake
uses persistent workers and a master process. In the case of"future_lapply"
parallelism, the master process is a separate background process called byRscript
. - Remove the appearance of staged parallelism from single-job
make()
's. (Previously, there were "check" messages and a call tostaged_parallelism()
.) - Remove some remnants of staged parallelism internals.
- Allow different parallel backends for imports vs targets. For example,
make(parallelism = c(imports = "mclapply_staged", targets = "mclapply")
. - Fix a bug in environment pruning. Previously, dependencies of downstream targets were being dropped from memory in
make(jobs = 1)
. Now, they are kept in memory until no downstream target needs them (formake(jobs = 1)
). - Improve
predict_runtime()
. It is a more sensible way to go about predicting runtimes with multiple jobs. Likely to be more accurate. - Calls to
make()
no longer leave targets in the user's environment. - Attempt to fix a Solaris CRAN check error. The test at https://github.com/ropensci/drake/blob/b4dbddb840d2549621b76bcaa46c344b0fd2eccc/tests/testthat/test-edge-cases.R#L3 was previously failing on CRAN's Solaris machine (R 3.5.0). In the test, one of the threads deliberately quits in error, and the R/Solaris installation did not handle this properly. The test should work now because it no longer uses any parallelism.
- Deprecate the
imports_only
argument tomake()
anddrake_config()
in favor ofskip_targets
. - Deprecate
migrate_drake_project()
. - Deprecate
max_useful_jobs()
. - For non-distributed parallel backends, stop waiting for all the imports to finish before the targets begin.
- Add an
upstream_only
argument tofailed()
so users can list failed targets that do not have any failed dependencies. Naturally accompaniesmake(keep_going = TRUE)
. - Add an RStudio R Markdown template compatible with https://krlmlr.github.io/drake-pitch/.
- Remove
plyr
as a dependency. - Handle duplicated targets better in
drake_plan()
andbind_plans()
. - Add a true function
target()
to help create drake plans with custom columns. - In
drake_gc()
, clean out disruptive files instorr
s with mangled keys (re: ropensci#198). - Move all the vignettes to the up and coming user manual: https://ropenscilabs.github.io/drake-manual/
- Rename the "basic example" to the "mtcars example".
- Deprecate
load_basic_example()
in favor ofload_mtcars_example()
. - Refocus the
README.md
file on the main example rather than the mtcars example. - Use a
README.Rmd
file to generateREADME.md
. - Add function
deps_targets()
. - Deprecate function
deps()
in favor ofdeps_code()
- Add a
pruning_strategy
argument tomake()
anddrake_config()
so the user can decide howdrake
keeps non-import dependencies in memory when it builds a target. - Add optional custom (experimental) "workers" and "priorities" columns to the
drake
plans to help users customize scheduling. - Add a
makefile_path
argument tomake()
anddrake_config()
to avoid potential conflicts between user-side customMakefile
s and the one written bymake(parallelism = "Makefile")
. - Document batch mode for long workflows in the HPC guide.
- Add a
console
argument tomake()
anddrake_config()
so users can redirect console output to a file. - Make it easier for the user to find out where a target in the cache came from:
show_source()
,readd(show_source = TRUE)
,loadd(show_source = TRUE)
.
- In R 3.5.0, the
!!
operator from tidyeval andrlang
is parsed differently than in R <= 3.4.4. This change broke one of the tests intests/testthat/tidy-eval.R
The main purpose ofdrake
's 5.1.2 release is to fix the broken test. - Fix an elusive
R CMD check
error from building the pdf manual with LaTeX. - In
drake_plan()
, allow users to customize target-level columns usingtarget()
inside the commands. - Add a new
bind_plans()
function to concatenate the rows of drake plans and then sanitize the aggregate plan. - Add an optional
session
argument to tellmake()
to build targets in a separate, isolated master R session. For example,make(session = callr::r_vanilla)
.
- Add a
reduce_plan()
function to do pairwise reductions on collections of targets. - Forcibly exclude the dot (
.
) from being a dependency of any target or import. This enforces more consistent behavior in the face of the current static code analysis functionality, which sometimes detects.
and sometimes does not. - Use
ignore()
to optionally ignore pieces of workflow plan commands and/or imported functions. Useignore(some_code)
to- Force
drake
to not track dependencies insome_code
, and - Ignore any changes in
some_code
when it comes to deciding which target are out of date.
- Force
- Force
drake
to only look for imports in environments inheriting fromenvir
inmake()
(plus explicitly namespaced functions). - Force
loadd()
to ignore foreign imports (imports not explicitly found inenvir
whenmake()
last imported them). - Reduce default verbosity. Only targets are printed out by default. Verbosity levels are integers ranging from 0 through 4.
- Change
loadd()
so that only targets (not imports) are loaded if the...
andlist
arguments are empty. - Add check to drake_plan() to check for duplicate targets
- Add a
.gitignore
file containing"*"
to the default.drake/
cache folder every timenew_cache()
is called. This means the cache will not be automatically committed to git. Users need to remove.gitignore
file to allow unforced commits, and then subsequentmake()
s on the same cache will respect the user's wishes and not add another.gitignore
. this only works for the default cache. Not supported for manualstorr
s. - Add a new experimental
"future"
backend with a manual scheduler. - Implement
dplyr
-styletidyselect
functionality inloadd()
,clean()
, andbuild_times()
. Forbuild_times()
, there is an API change: fortidyselect
to work, we needed to insert a new...
argument as the first argument ofbuild_times()
. - Deprecate the single-quoting API for files. Users should now use formal API functions in their commands:
file_in()
for file inputs to commands or imported functions (for imported functions, the input file needs to be an imported file, not a target).file_out()
for output file targets (ignored if used in imported functions).knitr_in()
forknitr
/rmarkdown
reports. This tellsdrake
to look inside the source file for target dependencies in code chunks (explicitly referenced withloadd()
andreadd()
). Treated as afile_in()
if used in imported functions.
- Change
drake_plan()
so that it automatically fills in any target names that the user does not supply. Also, anyfile_out()
s become the target names automatically (double-quoted internally). - Make
read_drake_plan()
(rather than an emptydrake_plan()
) the defaultplan
argument in all functions that accept aplan
. - Add support for active bindings:
loadd(..., lazy = "bind")
. That way, when you have a target loaded in one R session and hitmake()
in another R session, the target in your first session will automatically update. - Use tibbles for workflow plan data frames and the output of
dataframes_graph()
. - Return warnings, errors, and other context of each build, all wrapped up with the usual metadata.
diagnose()
will take on the role of returning this metadata. - Deprecate the
read_drake_meta()
function in favor ofdiagnose()
. - Add a new
expose_imports()
function to optionally forcedrake
detect deeply nested functions inside specific packages. - Move the "quickstart.Rmd" vignette to "example-basic.Rmd". The so-called "quickstart" didn't end up being very quick, and it was all about the basic example anyway.
- Move
drake_build()
to be an exclusively user-side function. - Add a
replace
argument toloadd()
so that objects already in the user's environment need not be replaced. - When the graph cyclic, print out all the cycles.
- Prune self-referential loops (and duplicate edges) from the workflow graph. That way, recursive functions are allowed.
- Add a
seed
argument tomake()
,drake_config()
, andload_basic_example()
. Also hard-code a default seed of0
. That way, the pseudo-randomness in projects should be reproducible across R sessions. - Cache the pseudo-random seed at the time the project is created and use that seed to build targets until the cache is destroyed.
- Add a new
drake_read_seed()
function to read the seed from the cache. Its examples illustrate whatdrake
is doing to try to ensure reproducible random numbers. - Evaluate the quasiquotation operator
!!
for the...
argument todrake_plan()
. Suppress this behavior usingtidy_evaluation = FALSE
or by passing in commands passed through thelist
argument. - Preprocess workflow plan commands with
rlang::expr()
before evaluating them. That means you can use the quasiquotation operator!!
in your commands, andmake()
will evaluate them according to the tidy evaluation paradigm. - Restructure
drake_example("basic")
,drake_example("gsp")
, anddrake_example("packages")
to demonstrate how to set up the files for seriousdrake
projects. More guidance was needed in light of this issue. - Improve the examples of
drake_plan()
in the help file (?drake_plan
).
- Transfer
drake
to rOpenSci: https://github.com/ropensci/drake - Several functions now require an explicit
config
argument, which you can get fromdrake_config()
ormake()
. Examples:- outdated()
- missed()
- rate_limiting_times()
- predict_runtime()
- vis_drake_graph()
- dataframes_graph()
- Always process all the imports before building any targets. This is part of the solution to #168: if imports and targets are processed together, the full power of parallelism is taken away from the targets. Also, the way parallelism happens is now consistent for all parallel backends.
- Major speed improvement: dispense with internal inventories and rely on
cache$exists()
instead. - Let the user define a trigger for each target to customize when
make()
decides to build targets. - Document triggers and other debugging/testing tools in the new "debug" vignette.
- Restructure the internals of the
storr
cache in a way that is not back-compatible with projects from versions 4.4.0 and earlier. The main change is to make more intelligent use ofstorr
namespaces, improving efficiency (both time and storage) and opening up possibilities for new features. If you attempt to run drake >= 5.0.0 on a project from drake <= 4.0.0, drake will stop you before any damage to the cache is done, and you will be instructed how to migrate your project to the new drake. - Use
formatR::tidy_source()
instead ofparse()
intidy_command()
(originallytidy()
inR/dependencies.R
). Previously,drake
was having problems with an edge case: as a command, the literal string"A"
was interpreted as the symbolA
after tidying. Withtidy_source()
, literal quoted strings stay literal quoted strings in commands. This may put some targets out of date in old projects, yet another loss of back compatibility in version 5.0.0. - Speed up clean() by refactoring the cache inventory and using light parallelism.
- Implement
rescue_cache()
, exposed to the user and used inclean()
. This function removes dangling orphaned files in the cache so that a broken cache can be cleaned and used in the usual ways once more. - Change the default
cpu
andelapsed
arguments ofmake()
toNULL
. This solves an elusive bug in how drake imposes timeouts. - Allow users to set target-level timeouts (overall, cpu, and elapsed) with columns in the workflow plan data frame.
- Document timeouts and retries in the new "debug" vignette.
- Add a new
graph
argument to functionsmake()
,outdated()
, andmissed()
. - Export a new
prune_graph()
function for igraph objects. - Delete long-deprecated functions
prune()
andstatus()
. - Deprecate and rename functions:
analyses()
=>plan_analyses()
as_file()
=>as_drake_filename()
backend()
=>future::plan()
build_graph()
=>build_drake_graph()
check()
=>check_plan()
config()
=>drake_config()
evaluate()
=>evaluate_plan()
example_drake()
=>drake_example()
examples_drake()
=>drake_examples()
expand()
=>expand_plan()
gather()
=>gather_plan()
plan()
,workflow()
,workplan()
=>drake_plan()
plot_graph()
=>vis_drake_graph()
read_config()
=>read_drake_config()
read_graph()
=>read_drake_graph()
read_plan()
=>read_drake_plan()
render_graph()
=>render_drake_graph()
session()
=>drake_session()
summaries()
=>plan_summaries()
- Disallow
output
andcode
as names in the workflow plan data frame. Usetarget
andcommand
instead. This naming switch has been formally deprecated for several months prior. - Deprecate the ..analysis.. and ..dataset.. wildcards in favor of analysis__ and dataset__, respectively. The new wildcards are stylistically better an pass linting checks.
- Add new functions
drake_quotes()
,drake_unquote()
, anddrake_strings()
to remove the silly dependence on theeply
package. - Add a
skip_safety_checks
flag tomake()
anddrake_config()
. Increases speed. - In
sanitize_plan()
, remove rows with blank targets "". - Add a
purge
argument toclean()
to optionally remove all target-level information. - Add a
namespace
argument tocached()
so users can inspect individualstorr
namespaces. - Change
verbose
to numeric: 0 = print nothing, 1 = print progress on imports only, 2 = print everything. - Add a new
next_stage()
function to report the targets to be made in the next parallelizable stage. - Add a new
session_info
argument tomake()
. Apparently,sessionInfo()
is a bottleneck for smallmake()
s, so there is now an option to suppress it. This is mostly for the sake of speeding up unit tests. - Add a new
log_progress
argument tomake()
to suppress progress logging. This increases storage efficiency and speeds some projects up a tiny bit. - Add an optional
namespace
argument toloadd()
andreadd()
. You can now load and read from non-defaultstorr
namespaces. - Add
drake_cache_log()
,drake_cache_log_file()
, andmake(..., cache_log_file = TRUE)
as options to track changes to targets/imports in the drake cache. - Detect knitr code chunk dependencies in response to commands with
rmarkdown::render()
, not justknit()
. - Add a new general best practices vignette to clear up misconceptions about how to use
drake
properly.
- Extend
plot_graph()
to display subcomponents. Check out argumentsfrom
,mode
,order
, andsubset
. The graph visualization vignette has demonstrations. - Add
"future_lapply"
parallelism: parallel backends supported by the future and future.batchtools packages. See?backend
for examples and the parallelism vignette for an introductory tutorial. More advanced instruction can be found in thefuture
andfuture.batchtools
packages themselves. - Cache diagnostic information of targets that fail and retrieve diagnostic info with
diagnose()
. - Add an optional
hook
argument tomake()
to wrap aroundbuild()
. That way, users can more easily control the side effects of distributed jobs. For example, to redirect error messages to a file inmake(..., parallelism = "Makefile", jobs = 2, hook = my_hook)
,my_hook
should be something likefunction(code){withr::with_message_sink("messages.txt", code)}
. - Remove console logging for "parLapply" parallelism.
drake
was previously using theoutfile
argument for PSOCK clusters to generate output that could not be caught bycapture.output()
. It was a hack that should have been removed before. - Remove console logging for "parLapply" parallelism.
drake
was previously using theoutfile
argument for PSOCK clusters to generate output that could not be caught bycapture.output()
. It was a hack that should have been removed before. - If 'verbose' is 'TRUE' and all targets are already up to date (nothing to build), then
make()
andoutdated()
print "All targets are already up to date" to the console. - Add new examples in 'inst/examples', most of them demonstrating how to use the
"future_lapply"
backends. - New support for timeouts and retries when it comes to building targets.
- Failed targets are now recorded during the build process. You can see them in
plot_graph()
andprogress()
. Also see the newfailed()
function, which is similar toin_progress()
. - Speed up the overhead of
parLapply
parallelism. The downside to this fix is thatdrake
has to be properly installed. It should not be loaded withdevtools::load_all()
. The speedup comes from lightening the firstclusterExport()
call inrun_parLapply()
. Previously, we exported every single individualdrake
function to all the workers, which created a bottleneck. Now, we just loaddrake
itself in each of the workers, which works becausebuild()
anddo_prework()
are exported. - Change default value of
overwrite
toFALSE
inload_basic_example()
. - Warn when overwriting an existing
report.Rmd
inload_basic_example()
. - Tell the user the location of the cache using a console message. Happens on every call to
get_cache(..., verbose = TRUE)
. - Increase efficiency of internal preprocessing via
lightly_parallelize()
andlightly_parallelize_atomic()
. Now, processing happens faster, and only over the unique values of a vector. - Add a new
make_with_config()
function to do the work ofmake()
on an existing internal configuration list fromdrake_config()
. - Add a new function
drake_batchtools_tmpl_file()
to write abatchtools
template file from one of the examples (drake_example()
), if one exists.
Version 4.3.0 has:
- Reproducible random numbers
- Automatic detection of knitr dependencies
- More vignettes
- Bug fixes
Version 4.2.0 will be released today. There are several improvements to code style and performance. In addition, there are new features such as cache/hash externalization and runtime prediction. See the new storage and timing vignettes for details. This release has automated checks for back-compatibility with existing projects, and I also did manual back compatibility checks on serious projects.
Version 3.0.0 is coming out. It manages environments more intelligently so that the behavior of make()
is more consistent with evaluating your code in an interactive session.
Version 1.0.1 is on CRAN! I'm already working on a massive update, though. 2.0.0 is cleaner and more powerful.