Adds a new event to the simulation's conditional event queue,
updating the simulation object by creating or appending to
sim$._conditionalEvents
.
This is very experimental. Use with caution.
A simList
simulation object.
A string, call or expression that will be assessed for TRUE
after each event in the regular event queue.
It can access objects in the simList
by using functions of sim
,
e.g., "sim$age > 1"
A character string specifying the module from which to
call the event. If missing, it will use
currentModule(sim)
A character string specifying the type of event from within the module.
A numeric specifying the priority of the event.
Lower number means higher priority. As a best practice, it is
recommended that decimal values are conceptual
grouped by their integer values (e.g., 4.0, 4.25, 4.5 are conceptually
similar).
See priority()
.
A numeric specifying the time before which the event should not occur,
even if the condition is met. Defaults to start(sim)
A numeric specifying the time after which the event should not occur,
even if the condition is met. Defaults to end(sim)
Returns the modified simList
object, i.e., sim$._conditionalEvents
.
This conditional event queue will be assessed at every single event in the normal event
queue. If there are no conditional events, then spades
will proceed as normal.
As conditional event conditions are found to be true, then it will trigger a call to
scheduleEvent(...)
with the current time passed to eventTime
and
it will remove the conditional event from the conditional queue.
If the user would like the triggered conditional event to occur as the very next event,
then a possible strategy would be to set eventPriority
of the conditional event
to very low or even negative to ensure it gets inserted at the top of the event queue.
Matloff, N. (2011). The Art of R Programming (ch. 7.8.3). San Francisco, CA: No Starch Press, Inc.. Retrieved from https://nostarch.com/artofr.htm
sim <- simInit(times = list(start = 0, end = 2))
#> Setting:
#> options(
#> reproducible.cachePath = '/tmp/RtmppEYNhs/myProject/cache'
#> spades.inputPath = '/tmp/RtmppEYNhs/myProject/inputs'
#> spades.outputPath = '/tmp/RtmppEYNhs/myProject/outputs'
#> spades.modulePath = '/tmp/RtmppEYNhs/myProject/modules'
#> spades.scratchPath = '/tmp/RtmppEYNhs/SpaDES/scratch'
#> )
#> Using setDTthreads(1). To change: 'options(spades.DTthreads = X)'.
condition <- "sim$age > 1" # provide as string
condition <- quote(sim$age > 1) # provide as a call
condition <- expression(sim$age > 1) # provide as an expression
sim <- scheduleConditionalEvent(sim, condition, "firemodule", "burn")
conditionalEvents(sim)
#> condition minEventTime maxEventTime moduleName eventType eventPriority
#> 1: sim$age > 1 0 2 firemodule burn 5
sim <- spades(sim) # no changes to sim$age, i.e., it is absent
#> Jan12 22:40:09 Using setDTthreads(1). To change: 'options(spades.DTthreads = X)'.
#> Jan12 22:40:09 chckpn total elpsd: 0.002 secs | 0 checkpoint init 0
#> Jan12 22:40:09 save total elpsd: 0.0044 secs | 0 save init 0
#> Jan12 22:40:09 prgrss total elpsd: 0.0061 secs | 0 progress init 0
#> Jan12 22:40:09 load total elpsd: 0.0078 secs | 0 load init 0
#> simList saved in
#> SpaDES.core:::.pkgEnv$.sim
#> It will be deleted at next spades() call.
events(sim) # nothing scheduled
#> Null data.table (0 rows and 0 cols)
sim$age <- 2 # change the value
sim <- spades(sim) # Run spades, the condition is now true, so event is
#> Jan12 22:40:10 Using setDTthreads(1). To change: 'options(spades.DTthreads = X)'.
#> Jan12 22:40:10 Conditional Event -- sim$age > 1 is true. Scheduling for now
#> simList saved in
#> SpaDES.core:::.pkgEnv$.sim
#> It will be deleted at next spades() call.
# scheduled at current time
events(sim) # now scheduled in the normal event queue
#> eventTime moduleName eventType eventPriority
#> 1: 2 firemodule burn 5