Il nome cita uno strano nome di colonnaSto cercando di inserire un nome di colonna in un'espressione del modello di adattamento. Per questo ho bisogno di sfuggire a strani caratteri nei nomi delle colonne per farlo usiamo la convenzione :"name"n. Quindi, come posso passare dal nome di una colonna di stringhe a questo formato?
colListY = {"Plating Thickness (m\!"\!")"};
//This doesn't work
newcolumnref = eval insert("\[:"^colListY[1]^"n]\");
//Looking for this end result
:"Plating Thickness (m\!"\!")"nChe poi posso inserire ovunque, per esempio:
insert into(expr(Y()), newcolumnref);
Qualcuno conosce un modo robusto per farlo?
Esplorazione e visualizzazione dei datiRi: Nome cita uno strano nome di colonna@Mark_Bailey
Ah, così facile! Grande!!!
Sono stato sorpreso di sentire da @pauldeen :
https://community.jmp.com/t5/Discussions/Name-quote-a-strange-column-name/mp/415735/highlight/true#M66485
Quello
quando si crea lo script del modello di adattamento, il formato column() non può essere utilizzato:</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, se è così, quale sarebbe la soluzione più semplice per ottenere la colonna senza colonna()...
Ora sono stato sorpreso di vedere (eseguendo il tuo codice) che ha funzionato davvero.
E sono tornato al vecchio frammento e non ha funzionato.
Woah!
Il puzzle viene risolto se metti entrambe le righe di codice esattamente una sotto l'altra:

-> Quindi fortunatamente, non è richiesta alcuna codifica non-Column () per Fit Model.
Ri: Nome cita uno strano nome di colonnaNames 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
);
Ri: Nome cita uno strano nome di colonna
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" )
);da
https://community.jmp.com/t5/Discussions/Need-help-with-expressions-column-references-formulas-and-column/mp/490220/highlight/true#M73282
Ri: Nome cita uno strano nome di colonnacolListY = {"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 )
)
)
);Il vuoto [ ] indica a JMP di valutare la colonna per la riga corrente.
La creazione di formule di colonna come questa probabilmente nasconde le dipendenze di colonna sottostanti dall'analizzatore di formule di JMP; Vedere discussione . Se si dispone di colonne formula che dipendono da altre colonne formula, JMP potrebbe non essere in grado di esaminare questa indiretta per capire cosa valutare per primo.
Ri: Nome cita uno strano nome di colonnaCiò si traduce in un errore di formula di colonna per me
Ri: Nome cita uno strano nome di colonna(senza provarlo, quindi potrebbe essere sbagliato)
Formula( column(expr(colListY[1])) - :height ),
Penso che tu voglia l'expr all'interno della colonna. In questo modo la funzione della colonna viene valutata successivamente, utilizzando la stringa acquisita in precedenza.
Ri: Nome cita uno strano nome di colonna@XanGregg Le formule di colonna non funzionano in questo modo e i metodi di citazione speciali funzionano:
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 colonna funzione in cui la formula è:
Column( "Plating Thickness (m\!"\!")" ) - /*###*/:height/*###*/
che non valuta.
Questo fa:
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 )
)));Conosci un modo per risolvere questo problema con il sistema column ()?
Ri: Nome cita uno strano nome di colonnaDopo aver testato attentamente e rivisto alcuni dei miei script, non sono riuscito a farlo fallire di nuovo. Grazie per il controllo!
Ri: Nome cita uno strano nome di colonnaQuesta è un'ottima domanda!
Ri: Nome cita uno strano nome di colonnaQuesta è un'ottima domanda!
Ri: Nome cita uno strano nome di colonna@XanGregg Ora che lo sto testando con il tuo codice, funziona anche qui. Fammi indagare e vedere se posso condividere l'esempio fallimentare in modo più completo ...
Ri: Nome cita uno strano nome di colonnaSolo per ridere, ho riportato il codice a JMP 11.2.1 e funziona alla grande.
Ri: Nome cita uno strano nome di colonnaPuoi approfondire la parte "non funziona"? Ho provato le versioni di nuovo a JMP 15 e il seguente sembra funzionare. Forse mi manca una 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()
);
Ri: Nome cita uno strano nome di colonnaPer spiegare a chiunque guardi: la funzione print fa due cose: evade le virgolette interne (e altri casi speciali) e aggiunge le virgolette esterne. Ciò produce una stringa valida e il codice di Paul aggiunge quindi un : davanti e una n dopo e analizza il risultato in un JSL nome colonna costante . Potrebbe esserci o meno una colonna effettiva che il file nome colonna costante può allegare a quando utilizzato in uno script. Non è necessario che la colonna esista quando viene eseguito il codice di Paul. Senza la funzione print(), non sono sicuro di quale funzione userei per eseguire l'escape (le regole sono troppo complicate per scriverne di mie). Poiché il nome originale conteneva virgolette incorporate, ha bisogno dell'escape prima di essere trasformato in un nome colonna costante .
Se la tabella dati è aperta, puoi utilizzare la funzione column() più o meno allo stesso modo per ottenere un file oggetto colonna che (ne sono abbastanza sicuro) può essere utilizzato negli stessi posti in cui il nome colonna costante può apparire. Quello oggetto colonna si riferisce a una colonna reale, almeno finché la tabella non viene chiusa. Avvio di una piattaforma con un file scaduto oggetto colonna o un nome colonna costante che non corrisponde a una colonna della tabella produrrà un messaggio di errore previsto.
@XanGregg
Ri: Nome cita uno strano nome di colonnaAggiornato con il feedback di Craige, grazie per l'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);
);Ri: Nome cita uno strano nome di colonnaEsso È troppo complicato. Probabilmente puoi sostituire regex() con trim() perché è tutto ciò che sta facendo. Inizialmente pensavo che avrebbe rimosso le virgolette esterne lasciate da print(). (modifica: e non è necessario tagliare affatto per l'analisi dell'input!)
Potresti avere [1] dove hai bisogno di [i] nel tuo esempio.
Ri: Nome cita uno strano nome di colonnaGrazie Craige, sembra che sia più complicato di quanto dovrebbe essere ma funziona 
Per chiunque provi a farlo, metto la soluzione di Craige in una funzione:
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);
);Ri: Nome cita uno strano nome di colonnaAltre note:
Ho fatto esplicito riferimento alla tabella nella funzione di colonna. Potrebbe fare la differenza se più tavoli sono aperti.
Se stai concatenando stringhe, questo potrebbe farlo; puoi sempre usare :"height"n anche se non richiesto (height, per esempio.)
colreftxt = ":" || Regex( Log Capture( Print( colListY[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n";
write(colreftxt);
:"Spessore placcatura (m\!"\!")"n
</CODE>che potrebbe essere sfuggito a destra. La manipolazione delle espressioni sarà probabilmente più semplice dell'analisi del testo assemblato in questo modo.</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-415759" slang="en-US" mode="NONE">Ri: Nome cita uno strano nome di colonna</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US" mode="NONE"><P>prova questa combinazione delle due risposte:</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 substitutedeseguire con la colonna sostituita
Ri: Nome cita uno strano nome di colonna@txnelson Il problema è che quando si crea lo script fit model non è possibile utilizzare il 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 gli utenti selezionano le colonne con una casella di riepilogo Col () e gli passo un messaggio << ottieni elementi. Questo mi dà l'elenco dei nomi delle colonne come una stringa. Potrei individuare quei nomi di colonna nella tabella e trovare il numero di colonna, ma durante l'assemblaggio dell'espressione degli effetti questo metodo non mi consentirà di creare le interazioni come mostrato sopra.
C'è un modo per eseguire la concatenazione di espressioni per passare dalla stringa al riferimento col con escape del nome?
Ri: Nome cita uno strano nome di colonnaSe puoi evitare di ottenere il nome della colonna come stringa e ottenere invece l'oggetto colonna, potrebbe essere più semplice. Di seguito, cols è un elenco di oggetti colonna, non i loro nomi.
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 )}
)
);
*/Ri: Nome cita uno strano nome di colonnaÈ possibile utilizzare le funzioni Column o As Column per fornire protezione al nome di colonna complesso
colListY = {"Plating Thickness (m\!"\!")"};
newcolumnref = eval insert("column(\!"^colListY[1]^\!")");