Crea/aggiungi nuove colonne utilizzando veriblesCiao ragazzi, mi scuso per il titolo confuso. Non ero sicuro di come formularlo.
La mia domanda è: ho un codice in cui aggiungo nuove colonne utilizzando condizioni lunghe.
Le condizioni sono le stesse per tutte le colonne, tranne che per un parametro che cambia.
Esiste un modo, invece di scrivere ogni volta il codice completo e le condizioni con il nuovo valore del parametro, per creare un modello (come una funzione) in cui utilizzerò una variabile al posto del parametro a cui invierò ogni volta il valore necessario per le condizioni della nuova colonna?
Automazione e scriptingAnalisi e modellazione dei dati di baseRe: Crea/aggiungi nuove colonne usando veriblesPuoi usare funzioni o espressioni per qualcosa del genere
https://www.jmp.com/support/help/en/18.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#ww339382
https://www.jmp.com/support/help/en/18.0/#page/jmp/advanced-functions.shtml#
Inserisci un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e Substitute
Re: Crea/aggiungi nuove colonne usando veriblesNon c'è bisogno di scrivere alcun codice.
Da JMP 18 è semplicissimo: basta dare un'occhiata a Discussioni/Formula/ - funzionalità n. 3.
Insomma:
Seleziona le colonne che vuoi usare come input, quindi fai clic con il pulsante destro del mouse su un'intestazione di colonna e fai clic su
nuova colonna formula / 
Come ultimo passaggio, digita la tua formula e clicca su 
[Ho selezionato 128 colonne, quindi creane 128 .
Se selezioni N colonne, verranno create N colonne : )
Re: Crea/aggiungi nuove colonne usando veriblesSe si desidera utilizzare esattamente la stessa formula più e più volte tramite il nuovo menu di scelta rapida delle formule, è possibile creare una propria "funzione personalizzata" e abilitare l'opzione Trasforma categoria per visualizzarla nel menu.
Dopo un riavvio il codice deve essere eseguito nuovamente, quindi includilo in un componente aggiuntivo o negli script di avvio.
Names Default To Here( 1 );
myAdd =
New Custom Function(
"custom",
"Add",
Function( {x, y = 1},
x + y - 1
)
);
myAdd << Transform Category( 1 );dall'indice di scripting:

Ma questo approccio è molto "statico". Per avere la possibilità di modificare un parametro, devi votare qui:
Nuovo menu Colonna Formula: mini GUI definite dall'utente
Re: Crea/aggiungi nuove colonne usando veriblesEcco un esempio di funzione che aggiungerà un numero. Mancano alcuni controlli per essere una "buona" funzione, ma fornisce l'idea necessaria che i valori che potrebbero cambiare (nome della colonna e numero da aggiungere in questo caso) devono essere valutati (vedi Inserisci un'espressione in un'altra... che ho menzionato prima)
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
cols = {"height", "weight"};
add_num_to_col = Function({dt, colname, num_to_add}, {Default Local},
new_col = Eval(EvalExpr(
dt << New Column(colname || " add " || char(num_to_add), Numeric, Continuous, Formula(
Expr(NameExpr(AsColumn(dt, colname))) + Expr(num_to_add)
));
));
return(new_col);
);
col1 = add_num_to_col(dt, "height", 10);
col2 = add_num_to_col(dt, "height", 20);
col3 = add_num_to_col(dt, "weight", 5);
Write();
A volte usare Eval(Substitute()) è una soluzione più pulita e facile da capire e potrebbe assomigliare a qualcosa del genere
add_num_to_col = Function({dt, colname, num_to_add}, {Default Local},
new_col = Eval(Substitute(
Expr(dt << New Column(colname || " add " || char(num_to_add), Numeric, Continuous, Formula(
_colname_ + _num_to_add_
))),
Expr(_colname_), Name Expr(AsColumn(dt, colname)),
Expr(_num_to_add_), num_to_add
));
return(new_col);
);Re: Crea/aggiungi nuove colonne usando veriblesUna combinazione degli approcci precedenti, con un piccolo tocco di novità :
- crea una funzione personalizzata *)
- aggiungilo a una categoria di formule
- fare clic con il tasto destro del mouse su un'intestazione di colonna e fare clic su nuova colonna formula /

- usa la nuova formula
- ... e inserisci manualmente il parametro:

*)
Add Custom Functions(
New Custom Function(
"custom",
"add++",
Function( {column, num_to_add},
{Default Local},
column,
num_to_add
),
<<FORMULA category=""></FORMULA>The benefit: the user can enter specific parameters for every new column.
The disadvantage: no <STRONG><EM>lotto</EM> </STRONG>mode like in the previous posts.<BR /><BR />kind of disadvantage: JMP doesn't <EM>risolvere/sostituire</EM> the formula, it keeps it as <FONT face="courier new,courier">aggiungi++(...)</FONT>.<BR /> To keep it alive the formula definition has to be executed again after a restart of JMP - and maybe: shared with colleagues.
Re: Crea/aggiungi nuove colonne usando veriblesGrazie a tutti per l'aiuto.
Ho un nuovo problema correlato che forse qualcuno può spiegarmi.
Ho utilizzato il seguente metodo per eliminare le righe senza dati in una colonna specifica:
dt << seleziona dove( Manca( Colonna( dt, nome_colonna )[riga()] ));
*Di conseguenza, elimina le righe corrette, ma allo stesso tempo elimina i valori nella colonna. Qualcuno può indicarmi l'errore?
Allego qui lo script stesso:
Re: Crea/aggiungi nuove colonne usando veriblesNames Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name="x";
New column(col_name); // maybe another column with the same name?
new_col = New column(col_name, Formula(if(:height>60,1 )));
// get the correct column name - uncomment to make it work
//col_name = new_col << get name();
dt << select where( Is missing( Column( dt,col_name )[row()] ));
wait(1);
dt << delete rows;
Re: Crea/aggiungi nuove colonne usando veriblesNon consiglio di usare stringhe per fare riferimento alle colonne. Capita spesso che la colonna effettiva venga creata aggiungendo un "2" - e la stringa porterà a un'altra colonna.
Quando generi la colonna, ottieni un handle per la colonna. Usa semplicemente questo handle e ti guiderà alla colonna giusta:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name="x";
new_col = New column(col_name, Formula(if(:height>60,1 )));
dt << select where( Is missing( new_Col[] ));
Re: Crea/aggiungi nuove colonne usando veriblesInoltre, non mi piace che [] sostituisca la colonna Column (col_name) con il valore corrente As column(col_name) .
:col può fare entrambe le cose - e ho imparato da @jthi :
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name="x";
new_col = New column(col_name, Formula(if(:height>60,1 )));
myCol = Name Expr(As Column(new_col)); // very cool trick (c) Jarmo
Show(Name Expr(myCol));
dt << select where( Is missing( myCol ));