Hola,
Gracias a los demás usuarios del foro, tengo un script funcionando que incluye conmutadores de columnas y filtros de datos locales. El script funciona como se esperaba y el siguiente paso es empaquetarlo como un complemento para la base de clientes. Creo que conozco los detalles del complemento y puedo ejecutar el script, que importa, limpia y resume los datos, y crea la interfaz. SIN EMBARGO, la interfaz ahora me da errores cuando intento ejecutar el conmutador de columnas, que funcionaba bien si ejecutaba el script por sí solo. Si hago clic en un nuevo elemento en el conmutador de columnas, obtengo el siguiente error: "He adjuntado el código que crea esta vista". En mi código, adjunto esto a una tabla de datos de resumen y luego lo ejecuto desde el script. Si lo ejecuto a través del complemento (donde acabo de adjuntar el script), arroja un error. Si luego cierro esa ventana y hago clic en el botón de la tabla de datos para crear la misma pantalla, funciona como se esperaba sin errores. Así que estoy un poco confundido sobre qué debería cambiar y qué información.
Andy

cell_sum << new script(
"Main Interface",
cell_sum = Current Data Table();
test = Fit Group(
Oneway(
Y( :Max Discharge Capacity ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Cycle Number (>0.8)"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Discharge Capacity @ 50 Cycles"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Remain % @ 50 Cycles"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
<<{Arrange in Rows( 4 )}
);
colpick = test << Column Switcher(
:Cathode Recipe.x,
cell_sum << get column names( Ordinal, Nominal )
);
(test << top parent)[listboxbox( 1 )] << set script(
Try( test << remove local data filter );
mycurrent = ((test << top parent)[listboxbox( 1 )] << get selected)[1];
test << Local Data Filter(
Add Filter( columns( Column( mycurrent ) ), Display( Column( mycurrent ), N Items( 15 ), Find( Set Text( "" ) ) ) )
);
);
test << Local Data Filter(
Add Filter( columns( colpick << get current ), Display( colpick << get current, N Items( 15 ), Find( Set Text( "" ) ) ) )
);
);
cell_sum << run script( "Main Interface" );
JSL se diferencia de muchos otros lenguajes de programación en que no realiza un control de alcance automático como, por ejemplo, podría hacerlo Python.En este caso estás usando la línea
(prueba << padre superior) [cuadro de lista (1)] << establecer secuencia de comandos (... para agregar un script al cuadro de lista.Cuando este script se ejecuta (cuando el usuario selecciona un elemento), entonces se debe resolver cualquier variable dentro de ese script; aquí es donde entra el alcance.En Python, cada función tiene un ámbito local y cada ámbito conoce su ámbito principal y el ámbito global (y los ámbitos son persistentes), de modo que una variable en una función puede acceder a las variables en el ámbito principal o global.JSL no hace esto: las funciones no crean ni recuerdan ámbitos y cualquier ámbito que se crea no mantiene un registro del ámbito que lo creó.Para JSL, cuando se accede a una variable sin ámbito (ya sea por espacio de nombres:variable o Según alcance (espacio de nombres, variable) entonces por defecto irá a la Aquí o alcance global y eso es todo.
La búsqueda de alcance para nombres sin alcance es algo como esto: Mire el espacio de nombres local si existe (si está en un Local( {}, ... ) función o Función( {}, {Local predeterminado}, ... ) función son las más comunes), mire el Aquí espacio de nombres (si existe), mire el espacio de nombres global.A veces mira los nombres de las columnas (como en un Por cada fila() función).
En su archivo, no utiliza ningún método abreviado de alcance automático (como Nombres predeterminados aquí ( 1 ) ), por lo que cada variable tiene un alcance global.Así, cuando el Cuadro de lista el script se ejecuta y puede encontrar prueba porque mira en el ámbito global.Sin embargo, los scripts adicionales utilizan por defecto el Nombres predeterminados aquí ( 1 ) función sea o no está en el archivo de script.Bajo este alcance, los archivos Aquí El espacio de nombres se elimina una vez que finaliza el script y el Cuadro de lista la secuencia de comandos no puede encontrar prueba en cualquier ámbito al que tenga acceso (es decir, su propio Aquí espacio de nombres y el espacio de nombres global).Puedes apagar el Nombres predeterminados aquí ( 1 ) en la versión adicional, pero no recomiendo esto y es mejor controlar explícitamente el alcance.
Dicho esto, para deshabilitar el Nombres predeterminados aquí ( 1 ) en la versión del complemento, desmarque la siguiente casilla:
