Nombre cita un nombre de columna extrañoEstoy tratando de insertar un nombre de columna en una expresión de modelo de ajuste. Para eso, necesito escapar de los caracteres extraños en los nombres de las columnas para hacer eso, usamos la convención :"name"n. Entonces, ¿cómo paso de un nombre de columna de cadena a este formato?
colListY = {"Plating Thickness (m\!"\!")"};
//This doesn't work
newcolumnref = eval insert("\[:"^colListY[1]^"n]\");
//Looking for this end result
:"Plating Thickness (m\!"\!")"nQue luego puedo insertar en cualquier lugar, por ejemplo:
insert into(expr(Y()), newcolumnref);
¿Alguien sabe de una manera robusta de hacer esto?
Exploración y visualización de datosRe: Nombre citar un nombre de columna extraño@Mark_Bailey
¡Ay, tan fácil! ¡¡¡excelente!!!
Me sorprendió saber de @pauldeen :
https://community.jmp.com/t5/Discussions/Name-quote-a-strange-column-name/mp/415735/highlight/true#M66485
eso
al crear el script del modelo de ajuste, no se puede usar el formato column():</CODE><HR /></BLOCKQUOTE><P> </P><PRE><CODE class=" language-jsl">Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
Y(column("Plating Thickness (m\!"\!"")), //<- does not workOK, si es así, ¿cuál sería la solución más fácil para obtener la columna sin columna() ...
Ahora me sorprendió ver (al ejecutar su código) que realmente funcionó.
Y volví al viejo fragmento, y no funcionó.
¡Guau!
El rompecabezas se resuelve si colocas ambas líneas de código exactamente una debajo de la otra:

-> Entonces, afortunadamente, no se requiere una codificación sofisticada que no sea Columna () para Fit Model.
Re: Nombre citar un nombre de columna extrañoNames Default To Here( 1 );
dt = New Table( "plating",
New Column( "Plating Thickness (m\!"\!")", Set Values( [1, 2, 3, 4] ) ),
New Column( "X", Set Values( [12, 26, 33, 39] ) )
);
col = Column( dt, "Plating Thickness (m\!"\!")" );
Fit Model(
Y( col ), // <- works :)
Effects( :X ),
Personality( "Standard Least Squares" ),
Run
);
Re: Nombre citar un nombre de columna extraño
dt = New Table( "plating",
Add Rows( 4 ),
New Column( "Plating Thickness (m\!"\!")",Set Values( [1, 2, 3, 4] )),
New Column( "X",Set Values( [12, 26, 33, 39] ))
);
colListY = {"Plating Thickness (m\!"\!")"};<BR /><BR /><BR />
newcolumnref = Name Expr(AsColumn(colListY[1])); // -> :"String"n<BR />
Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
//Y(column("Plating Thickness (m\!"\!"")), //<- does not work
Y(newcolumnref), // <- works :)
Effects(:X),
Personality( "Standard Least Squares" )
);de
https://community.jmp.com/t5/Discussions/Need-help-with-expressions-column-references-formulas-and-column/mp/490220/highlight/true#M73282
Re: Nombre citar un nombre de columna extrañocolListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
Eval(
Eval Expr(
dt << New Column( "test",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( Column( Expr( colListY[1] ) )[] ),
Set Display Width( 78 )
)
)
);El [ ] vacío le dice a JMP que evalúe la columna para la fila actual.
La creación de fórmulas de columnas como esta probablemente oculta las dependencias de las columnas subyacentes del evaluador de fórmulas de JMP; ver discusión . Si tiene columnas de fórmula que dependen de otras columnas de fórmula, es posible que JMP no pueda observar esta indirección para determinar qué evaluar primero.
Re: Nombre citar un nombre de columna extrañoEso da como resultado un error de fórmula de columna para mí
Re: Nombre citar un nombre de columna extraño(sin intentarlo, por lo que podría estar equivocado)
Formula( column(expr(colListY[1])) - :height ),
Creo que quieres la expr dentro de la columna. De esa manera, la función de columna se evalúa más tarde, utilizando la cadena capturada anteriormente.
Re: Nombre citar un nombre de columna extraño@xangregg Las fórmulas de columna no funcionan de esta manera y los métodos especiales de cotización sí funcionan:
colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
eval(eval expr(dt << New Column( "test",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( expr(column(colListY[1])) - :height ),
Set Display Width( 78 )
)));Produce una columna de función en la que la fórmula es:
Column( "Plating Thickness (m\!"\!")" ) - /*###*/:height/*###*/
que no evalúa.
Esto hace:
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName[i] ) ) || "n"))
);
,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName ) ) || "n"))
);
Return(ReturnList);
);
eval(eval expr(dt << New Column( "test2",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( expr(WrapColumns(colListY)[1]) - :height ),
Set Display Width( 78 )
)));¿Conoces alguna forma de arreglar esto con el sistema column()?
Re: Nombre citar un nombre de columna extrañoDespués de probar cuidadosamente y revisar algunos de mis scripts, no he podido hacer que falle nuevamente. ¡Gracias por revisar!
Re: Nombre citar un nombre de columna extraño¡Esta es una gran pregunta!
Re: Nombre citar un nombre de columna extraño¡Esta es una gran pregunta!
Re: Nombre citar un nombre de columna extraño@xangregg Ahora que lo estoy probando con su código, también funciona aquí. Déjame investigar y ver si puedo compartir el ejemplo fallido más completamente...
Re: Nombre citar un nombre de columna extrañoSolo para reírme, tomé el código de vuelta a JMP 11.2.1 y funciona muy bien.
Re: Nombre citar un nombre de columna extraño¿Puedes dar más detalles sobre la parte "no funciona"? Probé versiones anteriores a JMP 15 y lo siguiente parece funcionar. Tal vez me estoy perdiendo parte del problema.
Data Table( "Big Class" ):weight << Set Name( "weight\!"\!"" );
Fit Model(
Y( Column( "weight\!"\!"" ) ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Run()
);
Re: Nombre citar un nombre de columna extrañoPara explicar a cualquiera que esté mirando: la función de impresión hace dos cosas: escapa de las comillas internas (y otros casos especiales) y agrega comillas externas. Eso produce una cadena válida, y el código de Paul luego agrega un : al frente y una n después y analiza el resultado en un JSL constante de nombre de columna . Puede haber, o no, una columna real en la que el constante de nombre de columna se puede adjuntar cuando se usa en un script. La columna no necesita existir cuando se ejecuta el código de Paul. Sin la función print(), no estoy seguro de qué función usaría para realizar el escape (las reglas son demasiado complicadas para escribir las mías). Debido a que el nombre original contenía comillas incrustadas, necesita el escape antes de ser convertido en un constante de nombre de columna .
Si la tabla de datos está abierta, puede usar la función column() de la misma manera para obtener una objeto de columna que (estoy bastante seguro) se puede usar en todos los mismos lugares que el constante de nombre de columna puede aparecer Eso objeto de columna se refiere a una columna real, al menos hasta que se cierra la tabla. Lanzar una plataforma con una fecha de caducidad objeto de columna o un constante de nombre de columna que no coincida con una columna de la tabla generará un mensaje de error esperado.
@xangregg
Re: Nombre citar un nombre de columna extrañoActualizado con los comentarios de Craige, ¡gracias por el 1/i!
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName[i] ) ) || "n"))
);
,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName ) ) || "n"))
);
Return(ReturnList);
);Re: Nombre citar un nombre de columna extrañoÉl es demasiado complicado. Probablemente pueda reemplazar regex() con trim() porque eso es todo lo que está haciendo. Originalmente pensé que iba a eliminar las comillas externas que deja print(). (editar: ¡y no hay necesidad de recortar en absoluto para que la entrada se analice!)
Es posible que tenga [1] donde necesita [i] en su ejemplo.
Re: Nombre citar un nombre de columna extrañoGracias Craige, parece que esto es más complicado de lo que debería ser, pero funciona 
Para cualquiera que intente hacer esto, puse la solución de Craige en una función:
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
);
,
insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
);
Return(ReturnList);
);Re: Nombre citar un nombre de columna extrañoMás notas:
Hice referencia explícita a la tabla en la función de columna. Podría marcar la diferencia si hay varias mesas abiertas.
Si está concatenando cadenas, esto podría hacerlo; siempre puede usar :"altura"n incluso si no es necesario (altura, por ejemplo).
colreftxt = ":" || Regex( Log Capture( Print( colListY[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n";
write(colreftxt);
:"Espesor del revestimiento (m\!"\!")"n
</CODE>que podría escaparse a la derecha. La manipulación de expresiones probablemente será más fácil que analizar texto ensamblado de esta manera.</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-415759" slang="en-US" mode="NONE">Re: Nombre citar un nombre de columna extraño</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US" mode="NONE"><P>prueba esta combinación de las dos respuestas:</P><PRE><CODE class=" language-jsl">colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
script = Expr(
Fit Model(
Y( F1 ),
Effects( :height ),
Personality( "Standard Least Squares" ),
Run( F1 << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )} )
)
);
Substitute Into( script, Expr( F1 ), Column( dt, colListY[1] ) );
Write( Name Expr( script ) );
/*
Fit Model(
Y( Column( "Plating Thickness (m\!"\!")" ) ),
Effects( :height ),
Personality( "Standard Least Squares" ),
Run(
Column( "Plating Thickness (m\!"\!")" ) << {Plot Actual by Predicted( 1 ),
Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )}
)
)
*/
Eval( script );
run with column substitutedrun with column substitutedejecutar con la columna sustituida
Re: Nombre citar un nombre de columna extraño@txnelson El problema es que cuando se crea el script del modelo de ajuste, no se puede usar el formato column():
Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
Y(column("Plating Thickness (m\!"\!"")), //<- does not work
Effects(
:"Shift-temp"n, :Position, :Subgroup, :"Shift-temp"n * :Position,
:"Shift-temp"n * :Subgroup, :Position * :Subgroup
),
Personality( "Standard Least Squares" )
);@Craige_Hales los usuarios seleccionan las columnas con un cuadro de lista Col () y le paso un mensaje << obtener elementos. Eso me da la lista de nombres de columnas como una cadena. Podría ubicar esos nombres de columna en la tabla y encontrar el número de columna, pero al ensamblar la expresión de efectos, este método no me permitirá generar las interacciones como se muestra arriba.
¿Hay alguna manera de hacer una concatenación de expresiones para pasar de una referencia de cadena a columna con escape de nombre?
Re: Nombre citar un nombre de columna extrañoSi puede evitar obtener el nombre de la columna como una cadena y obtener el objeto de la columna en su lugar, podría ser más fácil. A continuación, cols es una lista de objetos de columna, no sus nombres.
colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
cols = dt << getcolumnnames;// don't use the string keyword
/* {name, "Plating Thickness (m\!"\!")"n, sex, height, weight} */
script = Expr(
Fit Model(
Y( :weight ),
Effects( F1 ),
Personality( "Standard Least Squares" ),
Run(
:weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Effect Leverage( 1 )}
)
)
);
Substitute Into( script, Expr( F1 ), cols[2] );
Write( Name Expr( script ) );
/*
Fit Model(
Y( :weight ),
Effects( "Plating Thickness (m\!"\!")"n ),
Personality( "Standard Least Squares" ),
Run(
:weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Effect Leverage( 1 )}
)
);
*/Re: Nombre citar un nombre de columna extrañoPuede usar las funciones Columna o Como columna para brindar protección al nombre de columna complejo
colListY = {"Plating Thickness (m\!"\!")"};
newcolumnref = eval insert("column(\!"^colListY[1]^\!")");