/
tar_sitrep.R
161 lines (160 loc) · 6.7 KB
/
tar_sitrep.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#' @title Show the cue-by-cue status of each target.
#' @export
#' @family inspect
#' @description For each target, report which cues are activated.
#' Except for the `never` cue, the target will rerun in [tar_make()]
#' if any cue is activated. The target is suppressed if the `never`
#' cue is `TRUE`. See [tar_cue()] for details.
#' @details Caveats:
#' * [tar_cue()] allows you to change/suppress cues, so the return
#' value will depend on the settings you supply to [tar_cue()].
#' * If a pattern tries to branches over a target that does not exist
#' in storage, then the branches are omitted from the output.
#' * `tar_sitrep()` is myopic. It only considers what happens to the
#' immediate target and its immediate upstream dependencies,
#' and it makes no attempt to propagate invalidation downstream.
#' @return A data frame with one row per target/object and one column
#' per cue. Each element is a logical to indicate whether the cue
#' is activated for the target.
#' See the `field` argument in this help file for details.
#' @inheritParams tar_manifest
#' @inheritParams tar_outdated
#' @param names Optional, names of the targets. If supplied, `tar_sitrep()`
#' only returns metadata on these targets.
#' The object supplied to `names` should be `NULL` or a
#' `tidyselect` expression like [any_of()] or [starts_with()]
#' from `tidyselect` itself, or [tar_described_as()] to select target names
#' based on their descriptions.
#' @param shortcut Logical of length 1, how to interpret the `names` argument.
#' If `shortcut` is `FALSE` (default) then the function checks
#' all targets upstream of `names` as far back as the dependency graph goes.
#' If `TRUE`, then the function only checks the targets in `names`
#' and uses stored metadata for information about upstream dependencies
#' as needed. `shortcut = TRUE` increases speed if there are a lot of
#' up-to-date targets, but it assumes all the dependencies
#' are up to date, so please use with caution.
#' Use with caution. `shortcut = TRUE` only works if you set `names`.
#' @param fields Optional, names of columns/fields to select. If supplied,
#' `tar_sitrep()` only returns the selected metadata columns.
#' You can supply symbols or `tidyselect` helpers
#' like [any_of()] and [starts_with()].
#' The `name` column is always included first
#' no matter what you select. Choices:
#' * `name`: name of the target or global object.
#' * `record`: Whether the `record` cue is activated:
#' `TRUE` if the target is not in the metadata ([tar_meta()]),
#' or if the target errored during the last [tar_make()],
#' or if the class of the target changed.
#' * `always`: Whether `mode` in [tar_cue()] is `"always"`.
#' If `TRUE`, [tar_make()] always runs the target.
#' * `never`: Whether `mode` in [tar_cue()] is `"never"`.
#' If `TRUE`, [tar_make()] will only run if the
#' `record` cue activates.
#' * `command`: Whether the target's command changed since last time.
#' Always `TRUE` if the `record` cue is activated.
#' Otherwise, always `FALSE` if the `command` cue is suppressed.
#' * `depend`: Whether the data/output of at least one of the target's
#' dependencies changed since last time.
#' Dependencies are targets, functions,
#' and global objects directly upstream.
#' Call `tar_outdated(targets_only = FALSE)` or
#' `tar_visnetwork(targets_only = FALSE)` to see exactly which
#' dependencies are outdated.
#' Always `NA` if the `record` cue is activated.
#' Otherwise, always `FALSE` if the `depend` cue is suppressed.
#' * `format`: Whether the storage format of the target
#' is different from last time.
#' Always `NA` if the `record` cue is activated.
#' Otherwise, always `FALSE` if the `format` cue is suppressed.
#' * `repository`: Whether the storage repository of the target
#' is different from last time.
#' Always `NA` if the `record` cue is activated.
#' Otherwise, always `FALSE` if the `format` cue is suppressed.
#' * `iteration`: Whether the iteration mode of the target
#' is different from last time.
#' Always `NA` if the `record` cue is activated.
#' Otherwise, always `FALSE` if the `iteration` cue is suppressed.
#' * `file`: Whether the file(s) with the target's return value
#' are missing or different from last time.
#' Always `NA` if the `record` cue is activated.
#' Otherwise, always `FALSE` if the `file` cue is suppressed.
#' @examples
#' if (identical(Sys.getenv("TAR_EXAMPLES"), "true")) { # for CRAN
#' tar_dir({ # tar_dir() runs code from a temp dir for CRAN.
#' tar_script({
#' list(
#' tar_target(x, seq_len(2)),
#' tar_target(y, 2 * x, pattern = map(x))
#' )
#' }, ask = FALSE)
#' tar_make()
#' tar_sitrep()
#' tar_meta(starts_with("y_")) # see also any_of()
#' })
#' }
tar_sitrep <- function(
names = NULL,
fields = NULL,
shortcut = targets::tar_config_get("shortcut"),
reporter = targets::tar_config_get("reporter_outdated"),
callr_function = callr::r,
callr_arguments = targets::tar_callr_args_default(callr_function, reporter),
envir = parent.frame(),
script = targets::tar_config_get("script"),
store = targets::tar_config_get("store")
) {
tar_assert_allow_meta("tar_sitrep", store)
force(envir)
names_quosure <- rlang::enquo(names)
fields_quosure <- rlang::enquo(fields)
tar_assert_scalar(shortcut)
tar_assert_lgl(shortcut)
tar_assert_flag(reporter, tar_reporters_outdated())
tar_assert_callr_function(callr_function)
tar_assert_list(callr_arguments)
tar_message_meta(store = store)
targets_arguments <- list(
path_store = store,
names_quosure = rlang::enquo(names),
shortcut = shortcut,
fields_quosure = rlang::enquo(fields),
reporter = reporter
)
callr_outer(
targets_function = tar_sitrep_inner,
targets_arguments = targets_arguments,
callr_function = callr_function,
callr_arguments = callr_arguments,
envir = envir,
script = script,
store = store,
fun = "tar_sitrep"
)
}
tar_sitrep_inner <- function(
pipeline,
path_store,
names_quosure,
shortcut,
fields_quosure,
reporter
) {
names_all <- pipeline_get_names(pipeline)
names <- tar_tidyselect_eval(names_quosure, names_all)
sitrep <- sitrep_init(
pipeline = pipeline,
meta = meta_init(path_store = path_store),
names = names,
shortcut = shortcut,
queue = "sequential",
reporter = reporter
)
sitrep$run()
out <- tibble::as_tibble(data.table::rbindlist(as.list(sitrep$sitrep)))
if (!is.null(names)) {
out <- out[match(names, out$name),, drop = FALSE] # nolint
}
fields <- tar_tidyselect_eval(fields_quosure, colnames(out)) %|||%
colnames(out)
out[, base::union("name", fields), drop = FALSE]
}