Known issues: https://github.com/PredictiveEcology/SpaDES.project/issues
experiment(),experiment2(),factorialDesign(),simInitAndExperiment()and thesimListsclass (withas.data.table.simLists()) moved here from the now-unmaintainedSpaDES.experiment;experiment()is now a light wrapper that builds the factorial set ofsimLists and runs them viaexperiment2().experiment2()(andexperiment()) forward named...such aseventstoSpaDES.core::spades(); the file-queueexperiment**family supports per-scenario events via aneventscolumn indf(#20).- New
teardownProject(out): reverses asetupProject()call. Removes the project library, unlinks the project paths, and restores the prior.libPaths()thatsetupProject()now stores on its output asout$paths$.previousLibPaths(#31). The previous (dot-prefixed).teardownProject()is kept as an alias. - New
re**family — inverse ofout**— for retrieving uploaded sims:reGet()(download from Google Drive),reUntar()(extract; optionalpathRemaprewrites a path prefix via GNUtar --transform),reLoad()(loadSimList()/readRDS()), and the wrapperreGetUntarLoad()(also appliespathRemapto each sim'soutputs()$filecolumn). Vectorised over a batch (e.g. adribblefromoutList()). See?reGetUntarLoad. - New
experimentMonitor()unifies tmux + experimentFuture worker discovery;stats = TRUEadds CPU / RAM / state.tmuxListPanes()is now a thin alias. experimentFutureList(ef)works cluster-wide: probes hostname → SSH-alias and does batched SSH liveness / kill /readlinkper machine;kill = TRUEalso pushes the demotion to the Google Sheet via the<queue_path>.ss_idsidecar.experimentFuture(ss_id = ...)drops a<queue_path>.ss_idsidecar for cross-session GS reconciliation.- Cluster
runWorkerLoopFuture()now usescallr::r_bg(stdout = log_file)instead ofsink()— log files flush in real time and remote workers show up under/proc/<pid>/fd/1.
-
setupProject()/setupPackages()print thedput()of the exact package vector passed toRequire::Requireatverbose >= 3. -
When a worker claims a job, any leftover status from a previous attempt (finish time, elapsed time, heartbeat, iteration count, interruption time) is cleared first. This applies to both the Google Sheet and the file-based job queues.
-
When a job is marked finished, its "claimed by" marker is cleared, while the process ID and machine name are kept as a record of what ran it.
-
After a running job is killed, its row in the job-tracking sheet is fully reset so it can be picked up and run again.
-
When two workers try to claim the same job at the same moment, the one that loses now retries with the next job instead of quitting.
-
Running jobs on another machine no longer corrupts file paths that live on shared/network storage outside the home directory (e.g.
/mnt/shared_cache/...). -
setupGitHub()skips the clone prompt whenprojectPathis already a git working copy. -
setUpstreamWithTry()walks every configured remote on lost-branch error, then auto-adds the github fork (<acct>/<repo>from the modules spec) as a new remote when the branch lives there; emits actionable message instead of aborting if the branch is missing everywhere. -
queueRead()now accepts a local.rdsqueue path as its sole argument:queueRead("path/to/queue.rds"). Useful for reading the file-backed queues written byexperimentTmux()/experimentFuture()/experimentSBATCH()without Google Sheets involvement. The two-argument Google-Sheet shape (queueRead(folder, name)) is unchanged. -
New
experimentFutureList()finds (and optionally kills) liveexperimentFuture()workers across R sessions. Scans/procfor R processes whose redirected stdout points to aworker_<NN>.log, joins each PID against the queue'sRUNNINGentries to report which row is currently being run.kill = TRUEsends SIGTERM (or SIGINT / SIGKILL viasignal); follow withtmuxRefreshQueueStatus()on eachqueue_pathto reset stale RUNNING rows. Linux-only (uses/proc/<pid>/fd/1). -
New
experiment_familydocumentation index (run?experiment_family) giving a high-level overview of the three runners (experimentTmux(),experimentFuture(),experimentSBATCH()), their shared queue /runNameLabel/statusCalculatecontract, and links to all the companion helpers (awaitExperiment*,killExperiment*,tmuxListPanes,tmuxRefreshQueueStatus, etc.). -
New
experimentSBATCH()runner: Slurm-native sibling ofexperimentTmux()andexperimentFuture(). Submitsn_workerslong-lived SBATCH jobs that each calltmuxRunWorkerLoop()against the shared queue (RDS or Google Sheets). Samedf/global_path/runNameLabel/statusCalculate/ queue semantics as the other two runners;coresis replaced bysbatch_opts = list(partition, time, mem, cpus_per_task, ...). Companion helpersawaitExperimentSBATCH()(pollssqueue) andkillExperimentSBATCH()(graceful via stop files;force = TRUEusesscancel).dry_run = TRUEgenerates the job scripts without submitting. -
New
scenarioS3 class for representing a single simulation run as a canonical record. The same run is identifiable in three ways and all three coerce to one another: the five field values (.ELFind,.samplingRange,.GCM,.SSP,.rep), an output directory path (e.g.outputs/6.3.1/2071-2100/CNRM-ESM2-1_ssp370/rep5), and an upload-tarball filename (e.g.6.3.1_2071-2100_CNRM-ESM2-1_ssp370_rep5.tar.gz). New API:scenario(),as_scenario()(with methods for character paths, lists, data.frames, and re-coercion),as_path(),as_tarname(),format.scenario,print.scenario, andregister_scenario_format()for project-specific column-name mappings. Companion helpersqueueRead(),queueUploadMissing(),outList(),outScenarios()work with the project queue (Google Sheet) and output directory. -
outSaveTarUpload()now accepts a pre-builttarballargument and skips the tar-build step when one is supplied. Useful when an earlier stage already produced the tarball and only the upload remains.
experiment3()(and itstmux_tail_commandhelper) have been removed. UseexperimentFuture()for non-tmux parallel runs, or the 10-linefurrr::future_pmap()kernel inline if you want a queue-less micro-runner. The conceptual differences are documented in the "Experiments" chapter of the SpaDES4Modellers book.SpaDES.configis no longer a dependency. Theconfigargument ofsetupProject()is still reserved but currently does nothing except give a clearer error (#78).
setupPaths(),setupModules(),setupPackages(), and the other innersetup*helpers each have their own help page now;?setup_familyis a new one-page overview showing how they fit together (#44).
plotSAs()(which plots study areas) no longer fails when the raster used for matching has categorical (factor) layers: those layers are now drawn with a discrete colour scale instead of erroring with "Discrete value supplied to a continuous scale". It also now handles plotting a study area on its own (with no matching raster), which previously failed.setupProject(): CRAN placeholder guard no longer errors withsubscript out of boundswhengetOption("repos")is an unnamed character vector or lacks aCRANentry.tmuxRunNextWorker(): workers no longer need thereproduciblepackage to start.setupPaths()detects an R version change since the previous run (e.g. 4.3 -> 4.5) by comparing the running Rmajor.minorto the trailing version segment of.libPaths()[1]. On mismatch it callsRequire::setupOff()to clear the stale.Rprofileblock before the regularRequire::setLibPaths(updateRprofile = TRUE)rewrites both.libPaths()and.Rprofilefor the current R.reUntar()tests now skip on systems without GNU tar (BSD tar on macOS rejects--absolute-names/--transform); regenerateoutSave()/outSaveTarUpload()Rd to includelazy; trim stray@params on theas_scenario()generic so they no longer trip theRd \usagecheck. Together these unstick GHA R-CMD-check on macOS.reUntar()/reGetUntarLoad()nowpath.expand()thepathRemapold/newso a leading~works (tar's--transformdoes not expand~).- Positional
pathBuild()now infers field names from bare-symbol arguments (e.g.pathBuild(.ELFind, .samplingRange, .GCM, .SSP, .rep)cachesc(".ELFind", ..., ".rep")asscenarioFields()automatically). This restores the canonical call style used inglobal.R/setupProject(paths = ...)without requiring an upfrontqueueRead()orscenarioFieldsSet(). Positional calls with literals (pathBuild("foo", 1L)) continue to require a primedscenarioFields(). experimentTmux(),tmuxRefreshQueueStatus(), and the worker loops (runWorkerLoopFuture(),.sync_loop_internal()) now callscenarioFieldsSet()on the queue's data columns before evaluatingrunNameLabel/statusCalculate. This restores positionalpathBuild(.ELFind, .samplingRange, .GCM, .SSP, .rep)calls (used bystatusCalculate_LandR,statusCalculate_FireSenseFit, and many userrunNameLabelquotes) when the queue comes from a programmaticdfrather than fromqueueRead()(which sets the field cache on its own).outUpload()now callstempdir(check = TRUE)before invokinggoogledrive::drive_upload()so the session tempdir is recreated if it has been deleted out from under R (intermittent NFS/cleanup issue).setupProject()now copies all required dependency packages (e.g.,pak,withr) to the isolated project library, not just those whose namespaces happen to be loaded at call time. Previously,setupSpaDES.ProjectDeps()usedgetNamespaceInfo(pkg, "path")to locate packages, which returned""for unloaded namespaces; the subsequentfile.exists(.../INDEX)check failed silently and the "Copying X packages" message was misleading. Now falls back tofind.package()withlib.locpointing to the caller's pre-switch.libPaths()(plumbed in via a newprevLibPathsarg).- Fixed code coverage reporting:
NOT_CRAN=trueis now set in the test-coverage workflow so thatskip_on_cran()tests run undercovr. - Fixed Windows path comparison in
scratchPathtest. setupProject()withuseGit = TRUEnow initializes the project git repository on branchmaininstead ofmaster.- Removed
mockerydependency from tests. - Fixed test warnings about non-portable paths (> 100 bytes) on macOS/Windows by suppressing in
pkgload2test. - Skipped
setupProjectpackage-installation test on Windows/macOS due to upstreamRequire@development/data.tableincompatibility. - Expanded test suite with utility-function tests (
spadesProjectOptions,setProjPkgDir,pkgload2,getModule,listModules, etc.) and addedpackagePath = .libPaths()[1L]tosetupProjecttest calls to prevent lib-path clobbering during testing.
experimentTmux()— orchestrate multi-run parallel experiments using tmux, with queue management, heartbeat monitoring, Google Sheets mirroring, and Rstudio-compatible fallback mode.tmuxRunWorkerLoop()/tmuxRunNextWorker()— lower-level tmux worker helpers for stepping through a queue of simulation runs.tmuxPrepareQueueFromDF()— build a tmux run-queue from a data frame of parameter combinations.tmuxRefreshQueueStatus()— refresh and report the status of a tmux queue (done / running / waiting).tmuxMirrorQueueToSheets()— mirror a tmux queue status to a Google Sheet for remote monitoring.tmuxKillPanes()/tmuxSetMouse()— tmux session utilities.assessDoneInFigure()— visually assess simulation completion status from output figures.preRunSetupProject()— source and partially evaluate aglobal.Rscript (up to a chosen call) before running experiments, so shared setup code runs once.plotSAs()/plotSAsLeaflet()— plotstudyArea*andrasterToMatch*objects from a list, using ggplot2 or leaflet respectively.spadesProjectOptions()— document and setSpaDES.project-specific R options.
setupProject(): theRequireinstall/load call is now optionally cached viareproducible::Cache, controlled by the newcacheRequireargument, reducing repeated package-resolution overhead across runs.setupProject():...arguments must now be named; an informative error is raised otherwise.setupProject()/pathsOverrideIfInTemp(): cross-platform fix for detecting when the entire project lives inside a temp directory — now usesfs::path_has_parent()instead of a root-path string comparison that failed on Windows.setupProject():studyAreaName2()no longer requiresreproducibleto be installed whenstudyArea = NULL.setupProject():setupStudyArea()Cachecall now passesuseCloud = FALSEand a safecacheSaveFormatfallback, preventing failures whenreproducible.useCloudis set globally or when usingreproducible>= 3.0.0.setupProject():evalDots()now usesinherits = FALSEwhen checking for default-dot values, preventing base R functions (e.g.mode()) from masking user-intended defaults.experiment3(): newlogFilesanddelayarguments; improved parallel execution viafurrr.setupPackages(): improved messaging when some packages are atHEADversions.- Local files containing vectors of package names are now supported in package-list arguments.
collect_showCache_async(): no longer stops on error.
- Fixed
isRstudio()returning the wrong answer when called from an RStudio terminal (vs. console). - Fixed
sideEffectsmissingparseFileListscall. - Fixed
build_proxyerror whensetupProject()is called with no...arguments. - Fixed
dimissue in spatial helpers. - Fixed
parallel::pskill(does not exist) →tools::pskillin tmux worker heartbeat code. - Removed use of
:::forreproducible::paddedFloatToCharandSpaDES.core::savedSimEnv. - Replaced
ggpubrwithpatchworkfor study-area plots, removing the transitiveggrepeldependency that required R >= 4.5.
experiment3new function to be used withsetupProject
- Allow modules to be specified using 1 of 2 full urls e.g., "https://github.com/..." see
?setup,modulesargument. - drop support for R <= 4.2 as several dependencies don't work rstatix, car, quantreg, MatrixModels, Matrix
Restarthad infinite restarting; fixed; was related to new elements address unrelated Git issues
Restartargument ofsetupProjectnow uses betterrstudioapicalls to open new project with active file.
- overhaul of all internals
setupProjectis a new omnibus function to address a number of needs for a SpaDES project, includingpaths,modules,options, and others. See?setupProject
newProjecthas been replaced bysetupProject
newProjectcan now take a vector of module names; if provided, these will be downloaded to themodulePathdirectory.
- move
SpaDES.corefromImportstoSuggests.
- initial version