Hello, I am currently trying to use the plotSave command in a loop and dynamically adjust the file name, so to speak. Unfortunately, I always get the error mentioned above. How do I fix this?
This is my code:
for j (1, rows(_all_shocks), 1); _shock = _all_shocks[j]; plotOpenWindow(); te=seqa(0,1,TAX.nirf); for i (1,10,1); plotlayout(4,3,i); plotSetTitle(&myPlot,Names[i]); temp=arraytomat(T.irf[_shock,.,i])~arraytomat(T1.irf[_shock,.,i]); plotxy(myPlot,te,temp); j_str = sprintf("%d", j); s = "file_" $~ j_str $~ ".pdf"; fname = strjoin(s, ","); plotSave(fname, 7.5|5.5, "in", 150); endfor; endfor;
First let's start by explaining and simplifying the code that creates the file name:
// Convert the loop counter integer into a string j_str = sprintf("%d", j); // Create a 1x3 string array with the // desired components of the file name s = "file_" $~ j_str $~ ".pdf"; // Combine the 3 elements in 's' // in a 1x1 string array with a comma // between each of the 3 elements of 's' fname = strjoin(s, ",");
We can make this much simpler by using the string combine operator like this:
fname = "file_" $+ ntos(j) $+ ".pdf";
The string combine operator
$+ will add the elements on either side into a single string. This should solve your problem.
EXTRA DETAILS I think the above solution is best for this problem, however, for a deeper understanding here are more details.
Internally a GAUSS string and a GAUSS string array are different types. This should usually not be something the user needs to be aware of. However, in this case, plotSave is requiring a string and will not take a string array.
The simplest way to convert a 1x1 string array into a string is by indexing. For example:
// Create a string s = "Apple"; // Convert it to a string array s = convertstrtosa(s); // Convert it back to a string s = s;