Char () su un effetto di interazioneHo difficoltà a credere che questo non sia stato chiesto prima e debba cercare le parole chiave sbagliate.
Background: presumo che un utente abbia eseguito Fit Model e salvato un risultato di interesse come Script nella tabella dati. Ho scritto JSL per estrarre l'argomento Effects () dallo script salvato. Supponiamo di avere effetti (: A,: B :,: A *:
.
Ho già scritto JSL che ottiene questo risultato (purché NON utilizzi Transform Column () nella lista degli effetti del modello - ciò creerebbe una nuova lattina di worm):
testList = {:A, :B, :A*:B};My Current Task: Voglio scrivere JSL per consentire al mio utente di selezionare uno di questi tre effetti.
Stato attuale: quello che ho fatto finora è questo:
win = New Window( "Test", Panel Box( "Choose an Effect", Radio Box( testList ) ) );
Se eseguo questo, ottengo una Radio Box con gli effetti "A", "B" e "Moltiplica". Chiaramente la Display Box sta scegliendo di togliere la testa () dal terzo effetto, invece di mostrare semplicemente "A * B".
Possibile soluzione: Penso che potrei risolvere questo problema scrivendo un ciclo per controllare Head (testList [i]) == "Multiply ()" e se lo è, quindi codificare un altro ciclo per estrarre ciascuno Arg (testList [i], j), convertirli in caratteri, inserirli in un'altra lista e Concat Items () con un separatore "*".
Domanda: C'è un percorso più diretto di questo che mi darà una Radio Box con gli effetti "A", "B" e "A * B"?
Re: Char () su un effetto di interazioneEcco cosa mi è venuto in mente. Ho deciso di costruire un Least Squares standard barebone, piuttosto che sostituire la Personality, dal momento che non so se alcune delle personalità del Fit Model potrebbero includere messaggi che non funzionerebbero in Standard Least Squares.
script = (Current Data Table() << Get Property("Fit Model"));
scriptAsStandardLeastSquares = Expr(Fit Model());
nFitModelArgs = N Arg( script );
For( k = 1, k <= nFitModelArgs, k++,
headString = Char( Head( Arg( script, k ) ) );
If(
headString == "Y" | headString == "Effects", Insert Into(scriptAsStandardLeastSquares, Arg(script, k))
);
);
Insert Into(scriptAsStandardLeastSquares, Expr(Run()));
Insert Into(scriptAsStandardLeastSquares, Expr(Personality("Standard Least Squares")));
Insert Into(scriptAsStandardLeastSquares, Expr(invisible));
fm = Eval(scriptAsStandardLeastSquares);
effectList = (fm << Get Effect Names);
fm << Close Window;Re: Char () su un effetto di interazioneQuesto è il tipo di codice che uso:
// s = model script
// easier to manipulate strings
str = Char(NameExpr(s));
// ensure there is a variable to store a reference to the model object
str = "mwin=" || str;<BR /><BR /><BR />// run in the background
SubstituteInto(str,"Fit Model(","Fit Model(Invisible,");
// change emphasis (could also change personality)
pattern = "Emphasis(" + PatArb() + ")" + PatRem();
replace = "Emphasis( Minimal Report ), Run)";
Pat Match(strScript, pattern, replace);
// execute and retrieve results
Eval(Parse(str));
effects = mwin << Get Effect Names;Re: Char () su un effetto di interazioneNo, questo non funzionerà. Supponiamo che io abbia uno scienziato che usa deliberatamente i due punti nel nome della colonna (forse per rappresentare un rapporto). Quindi il JSL da @txnelson potrebbe assomigliare a questo:
testList = {:Name("A:total"), :Name("B:total"), :Name("A:total") * :Name("B:total")};
newtestlist = testList;
For( i = 1, i <= N Items( testlist ), i++,
newtestlist[i] = Substitute(Char( testlist[i] ), ":", "")
);
win = New Window( "Test", Panel Box( "Choose an Effect", Radio Box( newtestList ) ) );Il box radio fornisce Atotal, Btotal e il nome veramente brutto ("Atotal") * Nome ("Btotal").
No, penso che preferirei il messaggio Get Effect Names finché riuscirò a farlo funzionare. Penso di essere diretto a riscrivere lo script salvato nella tabella dati per forzare i minimi quadrati standard in modo da poter ottenere i nomi.
Re: Char () su un effetto di interazioneUna volta che sono "considerati", puoi fare una S ubstituteInto rimuovere i due punti
Re: Char () su un effetto di interazioneAnche se forse potrei semplicemente riscrivere lo script Fit Model per forzare la personalità dei minimi quadrati standard ed eseguire il modello (sbagliato) abbastanza lontano da permettermi di ottenere i nomi degli effetti?
Re: Char () su un effetto di interazioneQuesto è davvero molto promettente per la mia applicazione, ma funziona solo con la personalità Fit Least Squares. Sfortunatamente, ho bisogno di qualcosa che funzioni in Fit Least Squares ma anche con Fit Mixed e Generalized Regression.
Re: Char () su un effetto di interazioneFunziona ma lascia i due punti dietro. Anche questo diventa davvero brutto se i nomi delle colonne contengono caratteri che impongono a JMP di avvolgere il nome della colonna nella funzione Name ().
Re: Char () su un effetto di interazioneHo risolto questo problema nel modo seguente in passato
testList = {:A, :B, :A * :B};
newtestlist = testList;
For( i = 1, i <= N Items( testlist ), i++,
newtestlist[i] = Char( testlist[i] )
);
win = New Window( "Test", Panel Box( "Choose an Effect", Radio Box( newtestList ) ) );Re: Char () su un effetto di interazioneA volte una via indiretta è più facile. Dato che hai lo script, eseguilo in background invia i Get Effect Names all'oggetto del modello fit, quindi hai l'elenco che puoi usare per i tuoi pulsanti radio.