setEnsemblePaths() now looks up variables in settings$run$site when interpolating path templates (#4100). This allows site-specific path components via e.g.
createMultiSiteSettings(s, data.frame(id = ..., grid_cell = ...)) |>
setEnsemblePaths(..., path_template = "met/{grid_cell}/ERA5.{n}.clim")`
loadPath.SitePFT(path) now takes only one argument, removing the previously required but ignored settings (@Thomas-Sedhom, #3834).check.model.settings() now skips lookup of the model binary path if no DB connection is provided (#3863).check.database.settings, it now skips with an INFO instead of a WARN. Rationale: now that the database is optional, a settings with no DB block is a valid settings.<path>/your/file.here</path> instead of the previous <path><path1>/your/file.here</path1></path> (#3561).tag argument to listToXml() is now optional and will default to "pecan" if not specified. This sets the name of the root tag of the resulting XML object (#3558).listToXml.MultiSettings() has been renamed from item to x, and it now accepts but ignores ..., both for consistency with the generic (#3558).setEnsemblePaths() no longer restricts the set of values accepted for input_type (#3633)createMultiSiteSettings now names each site's block of settings$run as site.[siteid] for easier subsetting (was settings.[n]).write.settings will now return the formatted XML as a string (and not write to any file) when called with outputfile = NULL, for consistency with XML::saveXML and for convenience when debugging.createMultiSiteSettings argument siteIds now accepts data frames as well as the previously accepted numeric or character vectors. The data frame should have one site per row, uniquely identified by a mandatory id column. All columns of each row will become fields of the resulting settings$run$site block.setEnsemblePaths inserts paths to your ensemble inputs (met, poolinitcond, etc) into every site's inputs block according to the filename pattern specified in a template string.settings.[n].getRunSettings is no longer exported. As the documentation has long noted, it was not intended to be called directly.