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 da un nome di colonna di stringa 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, ad esempio:
insert into(expr(Y()), newcolumnref);
Qualcuno sa di un modo robusto per farlo?
SceneggiaturaRe: Il 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 delle colonne sottostanti dal programma di valutazione delle formule di JMP; vedere discussione . Se le colonne formula dipendono da altre colonne formula, JMP potrebbe non essere in grado di eseguire il peering in questa direzione indiretta per capire cosa valutare per primo.
Re: Il nome cita uno strano nome di colonnaCiò si traduce in un errore di formula della colonna per me
Re: Il 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 di colonna viene valutata in un secondo momento, utilizzando la stringa acquisita in precedenza.
Re: Il nome cita uno strano nome di colonna@Xan Gregg Le formule delle colonne non funzionano in questo modo e i metodi di quotazione 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()?
Re: Il nome cita uno strano nome di colonnaDopo accurati test e ripassando alcuni dei miei script non sono stato in grado di farlo fallire di nuovo. Grazie per il controllo!
Re: Il nome cita uno strano nome di colonnaQuesta è un'ottima domanda!
Re: Il nome cita uno strano nome di colonnaQuesta è un'ottima domanda!
Re: Il nome cita uno strano nome di colonna@Xan Gregg Ora che lo sto testando con il tuo codice, funziona anche qui. Fammi indagare e vedere se riesco a condividere l'esempio fallito in modo più completo...
Re: Il nome cita uno strano nome di colonnaSolo per ridere, ho riportato il codice a JMP 11.2.1 e funziona benissimo.
Re: Il nome cita uno strano nome di colonnaPuoi approfondire la parte "non funziona"? Ho provato le versioni precedenti a JMP 15 e quanto segue sembra funzionare. Forse mi sfugge 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: Il nome cita uno strano nome di colonnaPer spiegare a chiunque guardi: la funzione di stampa fa due cose: evita 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 costante del nome della colonna . Potrebbe esserci o meno una colonna effettiva che il file costante del nome della colonna può allegare quando viene 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 utilizzerei 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 a costante del nome della colonna .
Se la tabella di dati è aperta, puoi usare la funzione column() più o meno allo stesso modo per ottenere a oggetto colonna che (sono abbastanza sicuro) può essere utilizzato in tutti gli stessi posti che il costante del nome della colonna può apparire. Quella oggetto colonna si riferisce a una colonna reale, almeno fino alla chiusura della tabella. Avvio di una piattaforma con una scadenza oggetto colonna o a costante del nome della colonna che non corrisponde a una colonna della tabella produrrà un messaggio di errore previsto.
@Xan Gregg
Re: Il nome cita uno strano nome di colonnaAggiornato con il feedback di Craige, grazie per la 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: Il 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 che print() lascia alle spalle. (modifica: e non è necessario tagliare per l'input da analizzare!)
Potresti avere [1] dove ti serve [i] nel tuo esempio.
Re: Il 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);
);Re: Il nome cita uno strano nome di colonnaAltre note:
Ho fatto riferimento esplicitamente alla tabella nella funzione di colonna. Potrebbe fare la differenza se sono aperti più tavoli.
Se stai concatenando stringhe, questo potrebbe farlo; puoi sempre usare :"altezza"n anche se non richiesto (altezza, 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">Re: Il nome cita uno strano nome di colonna</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US"><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 substitutedeseguito con colonna sostituita
Re: Il nome cita uno strano nome di colonna@txnelson Il problema è che durante la creazione dello script del modello di adattamento 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 << get items. 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 delle espressioni per passare dalla stringa al riferimento col con il nome escape?
Re: Il 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 )}
)
);
*/Re: Il nome cita uno strano nome di colonnaÈ possibile utilizzare le funzioni Colonna o Come colonna per fornire protezione al nome di colonna complesso
colListY = {"Plating Thickness (m\!"\!")"};
newcolumnref = eval insert("column(\!"^colListY[1]^\!")");