Char () sobre un efecto de interacciónMe cuesta creer que esto no se haya preguntado antes y debo buscar las palabras clave incorrectas.
Antecedentes: supongo que un usuario ha ejecutado Fit Model y ha guardado un resultado de interés como Script en la tabla de datos. He escrito JSL para extraer el argumento Effects () del script guardado. Supongamos que tenemos Efectos (: A,: B :,: A *:
.
Ya escribí JSL que obtiene este resultado (siempre y cuando NO esté utilizando Transform Column () en la lista de efectos del modelo, eso crearía una lata de gusanos completamente nueva):
testList = {:A, :B, :A*:B};Mi tarea actual: quiero escribir JSL para permitir que mi usuario seleccione uno de estos tres efectos.
Estado actual: Lo que he hecho hasta ahora es esto:
win = New Window( "Test", Panel Box( "Choose an Effect", Radio Box( testList ) ) );
Si ejecuto esto, obtengo una Radio Box con los efectos "A", "B" y "Multiplicar". Claramente, la caja de presentación está eligiendo quitar la cabeza () del tercer efecto, en lugar de simplemente mostrar "A * B".
Solución posible: creo que podría solucionar esto escribiendo un bucle para verificar Head (testList [i]) == "Multiplicar ()" y, si es así, codifique otro bucle para extraer cada uno de los Arg (testList [i], j), conviértalos en caracteres, póngalos en otra lista y Concat Items () con un separador "*".
Pregunta: ¿Hay una ruta más directa que esta que me dé una Radio Box con los efectos "A", "B" y "A * B"?
Re: Char () en un efecto de interacciónAquí es lo que se me ocurrió. Decidí crear un estándar de mínimos cuadrados barebones, en lugar de sustituir a la Personalidad, ya que no sé si algunas de las personalidades del Modelo de ajuste podrían incluir mensajes que no funcionen en los Mínimos cuadrados estándar.
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 () en un efecto de interacciónEste es el tipo de código que 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 () en un efecto de interacciónNo, esto no funcionará. Supongamos que tengo un científico que está utilizando deliberadamente dos puntos en el nombre de la columna (tal vez para representar una proporción). Entonces el JSL de @txnelson podría tener este aspecto:
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 ) ) );La caja de radio luego le da a Atotal, Btotal, y al nombre realmente feo ("Atotal") * Nombre ("Btotal").
No, creo que preferiría el mensaje Obtener nombres de efectos siempre que pueda hacerlo funcionar. Creo que me dirijo a reescribir el script guardado en la tabla de datos para forzar los mínimos cuadrados estándar para poder obtener los nombres.
Re: Char () en un efecto de interacciónUna vez que están "chared" puedes hacer una S ubstituteInto quitar los dos puntos
Re: Char () en un efecto de interacción¿Aunque quizás podría simplemente reescribir el script de Fit Model para forzar la personalidad de los mínimos cuadrados estándar y ejecutar el modelo (incorrecto) lo suficiente como para permitirme acceder a los nombres de efectos?
Re: Char () en un efecto de interacciónEn realidad, esto es muy prometedor para mi aplicación, pero solo funciona con la personalidad Ajustar mínimos cuadrados. Desafortunadamente, necesito algo que funcione en Fit Least Squares pero también con Fit Mixed and Generalized Regression.
Re: Char () en un efecto de interacciónEsto funciona pero deja atrás los dos puntos. Además, esto se pone realmente feo si los nombres de las columnas contienen caracteres que obligan a JMP a envolver el nombre de la columna en la función Nombre ().
Re: Char () en un efecto de interacciónHe resuelto este problema de la siguiente manera en el pasado
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 () en un efecto de interacciónA veces una ruta indirecta es más fácil. Ya que tiene la secuencia de comandos, ejecútelo en segundo plano, envíe los Nombres de efectos de obtención al objeto del modelo de ajuste, luego tiene la lista que puede usar para sus botones de radio.