Cómo programar el cuadro de diálogo Coincidencia de columnasTengo un cuadro de diálogo en el que necesito que un usuario haga coincidir pares de columnas. Más o menos como lo hacemos en Unir tablas.

Ejemplo específico: tengo conjuntos de parámetros medidos experimentalmente y conjuntos de sus predicciones teóricas. Estos datos provienen de diferentes fuentes y el nombre de las columnas puede ser arbitrario, por lo que necesito que los usuarios hagan coincidir la teoría con el experimento para cada parámetro.
¿Hay algún ejemplo de cómo escribir esta parte? ¿Y cómo mantener estos pares y cómo usarlos más adelante?
Hasta ahora tengo esto, y estoy interesado en cómo escribir el cuadro en el marco verde para reflejar los pares coincidentes (como en el ejemplo anterior) y cómo mantener esos pares (¿lista de 2 listas de elementos?) y cómo eliminar \ recuperar ellos, etc.:

Y aquí está el guión:
dt = New Table( "Untitled 5",
Add Rows( 4 ),
Set Header Height( 46 ),
New Column( "X", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "A_Theory", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 3, 2, 3] ) ),
New Column( "B_Measured", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 5, 6, 5] ) ),
New Column( "A_Measured", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 4, 3, 4] ) ),
New Column( "B_Theory", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 5, 3, 4] ) )
);
notImplemented = Expr(
win = New Window( "Feature Not Implemented Yet", <<MODAL></MODAL>
Fusión y limpieza de datosRe: Cómo programar el cuadro de diálogo Coincidencia de columnasDependiendo de cómo funcionará su aplicación, podría ser mejor no agregar valores a una lista hasta que el usuario presione el botón Ejecutar/Aceptar, ya que es posible que los usuarios deseen eliminar valores del cuadro de lista (actualmente no es posible).
Agregué el botón Ejecutar y runExpr a este ejemplo (si no tiene JMP16, puede modificar Transformar cada uno en un bucle For que agregará valores a una lista), eliminar el botón y borrar las selecciones del cuadro de lista de columnas cuando se presiona Coincidir:
Names Default To Here(1);
matchedList = {};
dt = New Table("Untitled 5",
Add Rows(4),
Set Header Height(46),
New Column("X", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 4])),
New Column("A_Theory", Numeric, "Continuous", Format("Best", 12), Set Values([1, 3, 2, 3])),
New Column("B_Measured", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 6, 5])),
New Column("A_Measured", Numeric, "Continuous", Format("Best", 12), Set Values([1, 4, 3, 4])),
New Column("B_Theory", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 3, 4]))
);
notImplemented = Expr(
a = (clb1 << get selected)[1];
b = (clb2 << get selected)[1];
clb1 << Clear selection;
clb2 << Clear selection;
lb << Append(a || "=" || b);
);
notImplemented2 = Expr(
lb << Remove Selected;
);
runExpr = Expr(
lb << get items;
lb_values = Transform Each({val}, lb << get items, Words(val, "="));
show(lb_values);
);
gui = Expr(
H List Box(
V List Box(
Panel Box("Theory",
clb1 = Col List Box(All, Nlines(5))
),
Panel Box("Experiment",
clb2 = Col List Box(All, Nlines(5))
)
),
Panel Box("Theory vs Experiment Matching",
H List Box(
Lineup box(N Col(1),
Button Box("Match", notImplemented),
Button Box("Remove", notImplemented2),
),
lb = List Box({}, Nlines(12))
)
),
Panel Box("Actions",
Button Box("Run",
runExpr;
)
)
)
);
fileLoad = New Window("Example", Show Menu(0), Show Toolbars(0), gui);
Re: Cómo programar el cuadro de diálogo Coincidencia de columnasBien, funciona de esta manera:
notImplemented = Expr(
a = (clb1 << get selected)[1];
b = (clb2 << get selected)[1];
lb << Append(a || "=" || b);
matchedList[N Items( matchedList ) + 1] = Eval List ({a, b});
//Insert Into(matchedList, Eval List(columnPair));
Show(matchedList);
);Re: Cómo programar el cuadro de diálogo Coincidencia de columnasUna pregunta más. Modifiqué el script de esta manera:
Names Default To Here(1);
matchedList = {};
dt = New Table("Untitled 5",
Add Rows(4),
Set Header Height(46),
New Column("X", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 4])),
New Column("A_Theory", Numeric, "Continuous", Format("Best", 12), Set Values([1, 3, 2, 3])),
New Column("B_Measured", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 6, 5])),
New Column("A_Measured", Numeric, "Continuous", Format("Best", 12), Set Values([1, 4, 3, 4])),
New Column("B_Theory", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 3, 4]))
);
notImplemented = Expr(
a = (clb1 << get selected)[1];
b = (clb2 << get selected)[1];
lb << Append(a || "=" || b);
Insert Into(matchedList, {a, b});
Show(matchedList);
);
gui = Expr(
H List Box(
V List Box(
Panel Box("Theory",
clb1 = Col List Box(All, Nlines(5))
),
Panel Box("Experiment",
clb2 = Col List Box(All, Nlines(5))
)
),
Panel Box("Theory vs Experiment Matching",
H List Box(
Button Box("Match", notImplemented),
lb = List Box({}, Nlines(12))
)
)
)
);
fileLoad = New Window("Example", Show Menu(0), Show Toolbars(0), gui);Y me sale esto:
matchedList = {a, b, a, b};Mientras esperaba esto:
matchedList = {{"A_Theory", "A_Measured"}, {"B_Theory", "B_Measured"}}O algo por el estilo para poder iterar a través de pares.
¿Qué estoy haciendo mal?
Re: Cómo programar el cuadro de diálogo Coincidencia de columnasDéjame probar eso.
Y luego hacer algo con estas columnas más tarde (por ejemplo, trazar Ajustar Y por X para cada par), ¿está bien mantenerlas como una lista de listas?
columnPairs = {{A_Theory, A_Experiment}, {B_Theory, B_Experiment}};y luego iterar a través de ellos o hay una mejor opción?
Re: Cómo programar el cuadro de diálogo Coincidencia de columnasSi tuviera que adivinar, la plataforma de unión usa Listbox en el que agrega nuevos valores cuando agrega pares de columnas.
Names Default To Here(1);
dt = New Table("Untitled 5",
Add Rows(4),
Set Header Height(46),
New Column("X", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 4])),
New Column("A_Theory", Numeric, "Continuous", Format("Best", 12), Set Values([1, 3, 2, 3])),
New Column("B_Measured", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 6, 5])),
New Column("A_Measured", Numeric, "Continuous", Format("Best", 12), Set Values([1, 4, 3, 4])),
New Column("B_Theory", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 3, 4]))
);
notImplemented = Expr(
a = clb1 << get selected;
b = clb2 << get selected;
lb << Append(a[1] || "=" || b[1]);
);
gui = Expr(
H List Box(
V List Box(
Panel Box("Theory",
clb1 = Col List Box(All, Nlines(5))
),
Panel Box("Experiment",
clb2 = Col List Box(All, Nlines(5))
)
),
Panel Box("Theory vs Experiment Matching",
H List Box(
Button Box("Match", notImplemented),
lb = List Box({}, Nlines(12))
)
)
)
);
fileLoad = New Window("Example", Show Menu(0), Show Toolbars(0), gui);
//{col1, col2} = Words((lb << get items)[1], "=");

Acabo de armar rápidamente la secuencia de comandos, así que use mejores nombres que los que usé para las variables, evite la selección de valores múltiples en los cuadros de lista de columnas y elimine los límites codificados de la indexación de columnas. Cuando necesite los valores, puede obtenerlos con << obtener elementos en la referencia del cuadro de lista, que le dará una lista de elementos. Luego use Words() para dividirlo aún más en diferentes partes.