Hola,
Desde una tabla con dos columnas que definen las coordenadas X e Y, estoy tratando de crear un cuadro de gráfico con un controlador interactivo para cada punto definido en la tabla. Agregar controles uno por uno (ver nw1 a continuación) funciona perfectamente, pero cuando intento automatizar el proceso usando ForEachRow o un bucle For (vea nw2 y nw3), obtengo un cuadro de gráfico con los puntos, pero no pueden ser movido interactivamente ¿Cuál sería la forma correcta de automatizar la creación de los controladores?
Gracias etienne
dt = Tabla nueva ( "Puntos de datos" , AddRows ( 3 )
Nueva Columna ( "xvar" Numérico "Continuo" , SetValues ([ 1 , 2 , 3 ])),
Nueva Columna ( "yVar" Numérico "Continuo" , SetValues ([ 1 , 2 , 3 ]))
);
CurrentDataTable (dt);
nw1 = Nueva ventana ( "Ejemplo 1" ,
gr1 = GraphBox (
Tamaño del marco( 400 , 400 ) Escala X ( 0 , 5 ) YScale ( 0 , 5 )
Encargarse de (: xVar [ 1 ],: yVar [ 1 ],: xVar [ 1 ] = x; : yVar [ 1 ] = y;);
Encargarse de (: xVar [ 2 ],: yVar [ 2 ],: xVar [ 2 ] = x; : yVar [ 2 ] = y;);
Encargarse de (: xVar [ 3 ],: yVar [ 3 ],: xVar [ 3 ] = x; : yVar [ 3 ] = y;);
);
);
nw2 = Nueva ventana ( "Ejemplo 2" ,
gr2 = GraphBox (
Tamaño del marco( 400 , 400 ) Escala X ( 0 , 5 ) YScale ( 0 , 5 )
Por cada fila (
Encargarse de (: xVar,: yVar,: xVar = x;: yVar = y;);
);
);
);
nw3 = Nueva ventana ( "Ejemplo 3" ,
gr3 = GraphBox (
Tamaño del marco( 400 , 400 ) Escala X ( 0 , 5 ) YScale ( 0 , 5 )
por (i = 1 , i <= NRows (dt), i ++,
Encargarse de (: xVar [i],: yVar [i],: xVar [i] = x;: yVar [i] = y;);
);
);
);
Gracias @cwillden . Su solución funciona perfectamente y es escalable. Me recuerda el código de macro de SAS, que es esencialmente lo que intentaba hacer aquí, es decir, escribir el bucle for y luego ejecutarlo.
Hola @rassart ,
Este es un caso en el que necesita codificar en los valores de fila de su tabla al agregar los manejadores. La razón se hace evidente cuando obtiene la secuencia de comandos de gráficos que acaba de crear fuera del cuadro de gráfico desde su ventana. Por ejemplo, la secuencia de comandos de gráficos del Ejemplo 3 se ve así después:
gr3 << Get Graphics Script;
/*:
{For( i = 1, i <= N Rows( dt ), i++,
Handle(
:xVar[i],
:yVar[i],
:xVar[i] = x;
:yVar[i] = y;
)
)}El valor final de la variable 'i' se establecerá en 4 con su ejemplo, por lo que ninguno de los manejadores funcionará correctamente ya que el valor de 'i' no fue codificado. Sin codificación rígida, el script gráfico siempre se basará en el valor actual de 'i'.
Aquí hay una forma en que puede codificar estos valores usando un bucle for:
nw4 = New Window( "Example 4", gr4 = Graph Box( FrameSize( 400, 400 ), X Scale( 0, 5 ), Y Scale( 0, 5 ), ) );
For( i = 1, i <= N Rows( dt ), i++,
Eval( Parse( Eval Insert( "gr4[framebox(1)] << Add Graphics Script(Handle(:xVar[^i^], :yVar[^i^], :xVar[^i^] = x; :yVar[^i^] = y;));" ) ) )
);
Aparentemente, la función Handle () no puede manejar el análisis en el momento de la ejecución. El siguiente script compensará eso
Current Data Table( dt );
nw1 = New Window( "Example 1",
gr1 = Graph Box(
FrameSize( 400, 400 ),
X Scale( 0, 5 ),
Y Scale( 0, 5 ),
Handle(
:xVar[1],
:yVar[1],
:xVar[1] = x;
:yVar[1] = y;
);
Handle(
:xVar[2],
:yVar[2],
:xVar[2] = x;
:yVar[2] = y;
);
Handle(
:xVar[3],
:yVar[3],
:xVar[3] = x;
:yVar[3] = y;
);
)
);