I'd like to write a function that will create and return a set of parameters to be used in a function mySimulation
I've created. Until now, I've basically been doing, e.g., mySimulation(parm1 = 3, parm2 = 4)
. This is now suboptimal because (1) in the actual version, the number of parameters is becoming unwieldy and (2) I'd like to keep track of different combinations of the parameters that produce the different models I'm using. So, I wrote createParms
(a minimally sufficient version shown below) to do the trick. My whole approach just seems so clunky though. With all the statisticians using R, I'm sure there's a more standard way of handling my issue...right?
createParms <- function(model = "default", ...) {
# Returns a list `parms` of parameters which will then be used in
# mySimultation(parms)
#
# Args:
# model: ["default" | "mymodel"] character string representation of a model
# with known parameters
# ...: parameters of the existing `model` to overwrite.
# if nothing is supplied then the model parameters will be left as is.
# passed variables must be named.
# e.g., `parm1 = 10, parm2 = 20` is good. `10, 20` is bad.
#
# Returns:
# parms: a list of parameters to be used in mySimulation(parms)
#
parms.names <- c("parm1", "parm2")
parms <- vector(mode = "list", length = length(parms.names))
names(parms) <- parms.names
overwrite <- list(...)
overwrite.names <- names(overwrite)
if (model == "default") {
parms$parm1 <- 0
parms$parm2 <- 0
} else if (model == "mymodel") {
parms$parm1 <- 1
parms$parm2 <- 2
}
if (length(overwrite) != 0) {
parms[overwrite.names] <- overwrite
}
return(parms)
}
If the simulation function always takes the same set of arguments, then Ramnath's approach of storing them in a data frame is best. For the more general case of variable inputs to
mySimulation
, you should store each set of inputs in a list – probably using a list of lists for running several simluations.The idea behind your
createParms
function looks sound; you can simplify the code a little bit.Test this with, e.g.,
do.call
may come in handy for running your simulation, as inEDIT: What
do.call
does for youIf you have
parms <- createParms()
, thenis the same as
The main advantage is that you don't need to spell out each parameter that you are passing into
mySimulation
(or to modify that function to accept the parameters in list form).