Salut,
J'ai des données de séries chronologiques où des segments de temps sont divisés en différents « cycles », et j'essaie de trouver un moyen de créer des lignes de référence marquant le début de chaque cycle. Je veux que ces lignes de référence soient mises à jour lorsque je modifie le filtre de données local entre les essais (car les cycles démarrent à des moments différents pour les différents essais).
Au début, j'utilisais un filtre de données local, détectant les changements dans le filtre de données local à l'aide de Make Row State Handler . Cependant, je ne pouvais pas comprendre comment obtenir les informations nécessaires à partir du filtre de données local (c'est-à-dire quel essai était filtré, même si j'aurais pu m'en approcher en utilisant la clause Get Where sur le filtre de données local) et je n'ai donc pas pu connaître l'essai qui était filtré et faire en sorte que cela dicte les temps de cycle à utiliser pour créer les lignes de référence. (cependant, si vous pensez que c'est une meilleure approche, faites-le moi savoir).
Ainsi, au lieu de laisser l'utilisateur interagir avec le filtre de données local et d'essayer de lire le filtre pour obtenir les essais filtrés, j'ai décidé de fournir une liste des essais à l'utilisateur, puis d'ajouter un filtre en fonction de l'essai sélectionné par l'utilisateur, tout en utilisant la sélection pour dicter les temps de cycle à utiliser pour créer les lignes de référence.
Cependant, je ne parviens pas à ajouter des lignes de référence qui changent lorsque l'utilisateur sélectionne un numéro d'essai différent.
Veuillez trouver mon code ci-dessous.
//Reference Lines that Update With Change in Local Data Filter
// Example Data
dt = New Table( "Example",
Add Rows( 3 ),
New Column( "Trial",
character,
"Ordinal",
Set Values( {"A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","B","B","B","B"} )
),
New Column( "Cycle",
Character,
"Ordinal",
Set Values( {"Rinse","Rinse","Rinse","Wash","Wash","Wash","Wash","FinalRinse","FinalRinse","FinalRinse","FinalRinse","Dry","Dry","Dry","Rinse","Rinse","Rinse","Wash","Wash","Wash","Wash","FinalRinse","FinalRinse","FinalRinse","FinalRinse","Dry","Dry","Dry
"} )
),
New Column( "%Clean",
Numeric,
"Continuous",
Set Values( {10,20,25,50,60,70,80,85,90,95,99,99,99,99,10,25,30,60,75,85,90,95,99,99.9,99.99,99.99,99.99,99.99} )
),
New Column( "Time",
Numeric,
"Continuous",
Set Values( {1,2,3,4,5,6,7,8,9,10,11,12,13,14,2,4,6,8,10,12,14,16,18,20,22,24,26,28} )
),
);
dt = current data table();
//Function to pull cycle start times (where reference lines will be drawn)
genRefLineValue = function({trialNum = "A", cycleNum = "Rinse"},{myrows,myvalues,min_value},
myrows = dt << get rows where(and(:Trial == trialNum,:Cycle == cycleNum));
myvalues = :Time[myrows];
min_value = min(myvalues);
Return(min_value);
);
//Function to pull unique cycles (I want the start time for EACH of the cycles)
findUniqueCycles = function({trialNum},{myrows,cycles,uniqueCycles},
myrows = dt << get rows where(:Trial == trialNum);
cycles = :Cycle[myrows];
uniqueCycles = associative array(cycles) << get keys;
return(uniqueCycles);
);
//Get unique trials (A, B, etc.)
summarize(unique_values=by(:Trial));
//Create window with radio buttons and graph
New Window( "Example",
HListBox(
PanelBox("Trial", //Adding radio buttons
rb = radio box(
unique_values, <<SET></SET>
At the bottom is where I add the reference lines. If you run the script and select between Trial A and B, you can see that while the filter's working and the data changes accordingly, the reference lines don't change (it might look like they change, but if you observe the actual values, they aren't changing). I've tried using <EM>monChoix</EM> in place of "A" so that the arguments in the loop that is creating the reference lines should update when the user selects Trial B:
<CODE class=" language-jsl">For(i=1,i<= (n items (findUniqueCycles(myChoice))),i++,
cycleName = findUniqueCycles(myChoice)[i];
cycleStart = genRefLineValue(myChoice,findUniqueCycles(myChoice)[i]);
report(biv)[axisbox(2)] << add ref line(cycleStart,"solid",,cycleName ||"(t="||char(cycleStart)||" min)",1.5);
);
But JMP complains by saying:
Name Unresolved: myChoice{3} in access or evaluation of 'myChoice' , myChoice/*###*/How do I make reference lines that update when the user changes their selection among trials?
Thanks in advance!
Je pense que tu y es presque.
Essayez de remplacer la dernière partie de vos codes par ceci
rb << Set Function(
Function( {this},{myChoice},
myChoice = Char( this << get selected );
(this << sib) << Set Text( myChoice );
//print(myChoice);
biv << remove local data filter;
biv << Local Data Filter(invisible, //updating (by removing then re-adding) the local data filter according to user's selection
Add Filter(
columns( :Trial ),
Where( :Trial == myChoice ),
));
if (myChoice == "A",
For(i=1,i<= (n items (findUniqueCycles("B"))),i++,
cycleStart = genRefLineValue("B",findUniqueCycles("B")[i]);
report(biv)[axisbox(2)] << remove ref line(cycleStart);
)
);
if (myChoice == "B",
For(i=1,i<= (n items (findUniqueCycles("A"))),i++,
cycleStart = genRefLineValue("A",findUniqueCycles("A")[i]);
report(biv)[axisbox(2)] << remove ref line(cycleStart);
)
);
For(i=1,i<= (n items (findUniqueCycles(myChoice))),i++,
cycleName = findUniqueCycles(myChoice)[i];
cycleStart = genRefLineValue(myChoice,findUniqueCycles(myChoice)[i]);
report(biv)[axisbox(2)] << add ref line(cycleStart,"solid",,cycleName ||"(t="||char(cycleStart)||" min)",1.5);
);
)
);
report(biv)[framebox(1)] << Frame Size( 1000, 400 );
//you need this to initialize somehow
For(i=1,i<= (n items (findUniqueCycles("A"))),i++,
cycleName = findUniqueCycles("A")[i];
cycleStart = genRefLineValue("A",findUniqueCycles("A")[i]);
report(biv)[axisbox(2)] << add ref line(cycleStart,"solid",,cycleName ||"(t="||char(cycleStart)||" min)",1.5);
);
De plus, l'erreur signifie que myChoice est introuvable ou indéfini, car vous l'avez utilisé en dehors de l'endroit où il est disponible, c'est-à-dire à l'intérieur d'un rappel.