@@ -7,19 +7,39 @@ write_model <- function(
77 ode_solver
88)
99{
10+ # Get the longest name among the initial values and parameters
11+ all_names <- c(
12+ names(initial_values ),
13+ names(parameters )
14+ )
15+
16+ name_width <- max(sapply(all_names , nchar ))
17+
18+ # Alphabetize the initial values and parameters
19+ initial_values <- initial_values [order(tolower(names(initial_values )))]
20+ parameters <- parameters [order(tolower(names(parameters )))]
21+
22+ # Prepare the module list strings
23+ dir_module_string <- paste(paste0(' ' , names(direct_modules ), ' = "' , direct_modules , ' "' ), collapse = ' ,\n ' )
24+ diff_module_string <- paste(paste0(' ' , names(differential_modules ), ' = "' , differential_modules , ' "' ), collapse = ' ,\n ' )
25+
26+ # Remove any lines without names
27+ dir_module_string <- gsub(' = ' , ' ' , dir_module_string )
28+ diff_module_string <- gsub(' = ' , ' ' , diff_module_string )
29+
1030 # Fill in the module definition template (defined below)
1131 model_text <- sprintf(
1232 model_definition_template ,
1333 name ,
14- paste(paste0( ' " ' , direct_modules , ' " ' ), collapse = ' , \n ' ) ,
15- paste(paste0( ' " ' , differential_modules , ' " ' ), collapse = ' , \n ' ) ,
34+ dir_module_string ,
35+ diff_module_string ,
1636 ode_solver [[' type' ]],
1737 ode_solver [[' output_step_size' ]],
1838 ode_solver [[' adaptive_rel_error_tol' ]],
1939 ode_solver [[' adaptive_abs_error_tol' ]],
2040 ode_solver [[' adaptive_max_steps' ]],
21- paste(paste0(' " ' , names(initial_values ), ' " = ' , initial_values ), collapse = ' ,\n ' ),
22- paste(paste0(' " ' , names(parameters ), ' " = ' , parameters ), collapse = ' ,\n ' )
41+ paste(paste0(' ' , format( names(initial_values ), width = name_width ), ' = ' , initial_values ), collapse = ' ,\n ' ),
42+ paste(paste0(' ' , format( names(parameters ), width = name_width ), ' = ' , parameters ), collapse = ' ,\n ' )
2343 )
2444}
2545
@@ -31,11 +51,11 @@ model_definition_template <- '%s <- list(
3151%s
3252 ),
3353 ode_solver = list(
34- type = "%s",
35- output_step_size = %f,
54+ type = "%s",
55+ output_step_size = %f,
3656 adaptive_rel_error_tol = %e,
3757 adaptive_abs_error_tol = %e,
38- adaptive_max_steps = %i
58+ adaptive_max_steps = %i
3959 ),
4060 initial_values = list(
4161%s
0 commit comments