Inserisci un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e SubstituteProblemaÈ necessario inserire il valore di una variabile in un'espressione senza valutare l'intero codice.Esempi inclusi:
- Scrivere formule di colonna utilizzando uno script
- Scrivere script utilizzando un altro script
Di seguito è riportato uno script per trasformare le colonne selezionate in una tabella. Questo sì NON funziona, perché l'espressione "cols[i]" viene salvata nella formula della colonna anziché nel nome della colonna.
//Open A Table and select a few columns
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length, Petal length};
//This code does not work
For( i = 1, i <= N Items(cols), i++,
dt << New Column(
"2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( As Column( cols[i] ) * 2)
)
);
Le nuove colonne vengono create con il nome corretto ma questa formula:

Soluzione
Esistono due strategie generali per risolvere questo problema: costruire l'espressione valutandone una parte prima del resto, e costruire l'espressione come una stringa e poi valutarla. Tieni presente che la variabile da inserire può effettivamente essere un'espressione di qualsiasi lunghezza.
Espressioni
Questi metodi implicano la scrittura di un'espressione e la valutazione di una sua parte prima del resto. Può essere complicato trovare la giusta combinazione di Eval, Eval Expr ed Expr, ma puoi vedere l'evidenziazione della sintassi e utilizzare l'editor di script per assicurarti che le parentesi corrispondano.
Eval, Eval Espr
Scrivi l'espressione e avvolgi tutte le parti che dovrebbero essere valutate immediatamente con Expr():
//Eval Expr
For( i = 1, i <= N Items(cols), i++,
Eval( Eval Expr(
dt << New Column(
"2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( As Column( Expr( Char( cols[i] ) ) ) * 2)
)
) )
);
Sostituire
Scrivi l'espressione e sostituiscine parte con il codice valutato:
//Substitute
For( i = 1, i <= N Items(cols), i++,
Eval( Substitute(
Expr( dt << New Column(
"2 * " || cn,
Numeric,
"Continuous",
Formula( As Column( cn ) * 2)
) ),
Expr( cn ),
Char( cols[i] )
) )
);
Metodi di stringa
Questi metodi implicano la scrittura dell'espressione come stringa, l'utilizzo di Parse() per convertirla in un'espressione e quindi di Eval() per valutarla effettivamente. Gli svantaggi di questi metodi includono la mancata visualizzazione dell'evidenziazione della sintassi, la necessità di gestire le virgolette doppie utilizzando \!" o \[ ... ]\ e la difficoltà generale di risolvere problemi o modificare in futuro, soprattutto per le espressioni lunghe.
Inserisci valutazione
Scrivi l'espressione come una stringa con codice 'in linea' che viene valutato e inserito all'interno della stringa, quindi analizzala e valutala:
//Eval Insert
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Eval Insert(
"\[dt << New Column(
"2 * ^Char( cols[i] )^",
Numeric,
"Continuous",
Formula( As Column( "^Char( cols[i] )^" ) * 2)
)]\"
) ) );
);
Sostituire
Scrivere l'espressione in una stringa con un segnaposto che viene sostituito con l'espressione valutata. Nota che questa è la stessa funzione di cui sopra:
//Substitute
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Substitute(
"\[dt << New Column(
"2 * ColumnName",
Numeric,
"Continuous",
Formula( As Column( "ColumnName" ) * 2)
)]\",
"ColumnName",
Char( cols[i] )
) ) );
);
Concatenare
La forma più semplice è scrivere l'espressione utilizzando '||'.Nota che potresti usare use \[ ... ]\ invece di \!":
//Concatenate
For( i = 1, i <= N Items(cols), i++,
Eval( Parse(
"dt << New Column(
\!"2 * " || Char( cols[i] ) || "\!",
Numeric,
\!"Continuous\!",
Formula( As Column( \!"" || Char( cols[i] ) || "\!" ) * 2)
)"
) );
);
Guarda anche
La sezione "Funzioni di gestione delle espressioni" della Guida allo scripting include questi e altri metodi per ottenere lo stesso risultato.Questo post sul blog di @Joseph Morgan contiene ulteriori esempi e approfondimenti sullo stesso argomento.
Grazie @Justin_Chilton per un feedback su questo post.
Inserisci variabili o espressioni in altre espressioni.Questa è una breve introduzione a Eval(), Eval Expr(), Substitute(), Parse() e Eval Insert().
Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e SubstituteEcco un esempio per un metodo di espressione e un metodo di stringa:
Names default to here(1);
//Open A Table and select a few columns
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length, Petal length};
//Eval Expr
For( i = 1, i <= N Items(cols), i++,
Eval( Eval Expr(
dt << New Column(
"Eval Expr 2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( Expr( cols[i] ) * 2 )
)
) )
);
//Substitute with String
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Substitute(
"\[dt << New Column(
"Substitute String 2 * ColumnName",
Numeric,
"Continuous",
Formula( :"ColumnName"n * 2)
)]\",
"ColumnName",
Char( cols[i] )
) ) );
);
Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e SubstitutePotrebbero esserci alcune funzioni non necessarie, ma puoi utilizzare Name Expr con riferimento alla colonna (As Column(name)):
Names Default To Here(1);
//Open A Table and select a few columns
dt = Open("$Sample_data/iris.jmp");
cols = {Sepal length, Petal length};
For(i = 1, i <= N Items(cols), i++,
Eval(Eval Expr(dt << New Column("2 * " || Char(cols[i]), Numeric, "Continuous", Formula(Expr(Name Expr(As Column(Char(cols[i])))) * 2))))
);
Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e SubstituteEsiste un modo in cui As Column() non è necessario?
Qui dobbiamo includerlo mentre stiamo passando una stringa, mi chiedo come farlo in modo che la formula rimanga con :column.
Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e SubstituteMolte grazie! SÌ. Hai ragione con l'inizio del loop. Non me ne ero reso conto.
Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e Substitute@Pivello ,
Il ciclo for inizia con i=2, ecco perché ha saltato la prima colonna e è stata creata un'unica colonna vuota denominata Colonna 1 quando è stata creata la tabella dati. Puoi "risolvere" questo problema avviando il ciclo con i=1 ed eliminando la colonna 1 dopo, in questo modo:
Visualizza altro... Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e Substituteciao,
ha funzionato per le colonne b e c. "a" non appare. Viene invece visualizzata una colonna 1 vuota.
Ecco perché ho provato a inserire il "ciclo for" all'interno della New Table (). Ma con questo approccio ottengo solo l'espressione all'interno della formula.
Sai come gestire il "ciclo for" con la formula all'interno di New Table() per ottenere tutte le colonne richieste contemporaneamente?
Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e SubstituteCIAO @Pivello ,
È necessario dire a JMP di valutare quell'espressione prima di inserirla nella formula, poiché una volta in una formula di colonna non sa più come fare riferimento all'altra tabella. Usando il mio metodo preferito (quello in alto sopra), potrebbe assomigliare a questo:
Names Default To Here( 1 ); //
//Table with columns you want to create
mydt = New Table( "Source",
Add Rows( 3 ),
New Column( "Name", Character, "Nominal", Set Values( {"a", "b", "c"} ) ),
New Column( "Mean", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [1, 2, 3] ) ),
New Column( "Std Dev", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [0.5, 0.6, 0.7] ) )
);
my_newdt = New Table( "Target", Add Rows( 100 ) );
// For loop. Add Columns
For( i = 2, i <= N Rows( mydt ), i++, //
Eval( Eval Expr(
my_newdt << New Column( Column( mydt, 1 )[i],
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( Expr( As Column( mydt, :Mean )[i] ), Expr( As Column( mydt, :Std Dev )[i] ) ) )//
)
) )
);
Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e SubstituteCreazione di una tabella con formula nelle colonne - Random Normal() - da jmp esterno
Ho già una soluzione funzionante per il mio problema. Collegamento sopra.
Tuttavia, sono ossessionato dal fatto che il mio codice funzioni correttamente.
E questo thread sembra rispondere al mio argomento.
Ho provato alcune delle tecniche di cui sopra. Ma non funziona o non lo capisco.
Hai un suggerimento per me? Come ottenere l'espressione " Come colonna (mydt, :Mean)[1] "risolto sui valori di origine?
//not working
Clear Globals();
Names Default To Here( 1 ); //
mydt = Current Data Table();
// New data table
my_newdt = New Table( "Table Name",
// Add Rows( N Rows( mydt ) ), // row count can be set by hand e.g. 1000
Add Rows( 10 ), // row count can be set by hand e.g. 1000
New Column( Column( mydt, 1 )[1], // Loop i==1
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( As Column( mydt, :Mean )[1], 0.01))// As Column(mydt, :Mean )[1] is evalueted in the target table. But Formula has the expression "As Column( mydt, :Mean )[1]" instead of a value from source table
)
);// End New data table
/*// For loop. Add Columns
For( i = 2, i <= N Rows( mydt ), i++, //
my_newdt << New Column( Column( mydt, 1 )[i], // Loop i ==2
Numeric,
"Continuous",
Format( "Best", 6 ),
Set Each Value( Random Normal( As Column( mydt, :Mean )[i], As Column( mydt, :Std Dev )[i] ) )//
)
)// End for loop;
;*/
Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e SubstituteMolto utile!
Re: inserire un'espressione in un'altra utilizzando Eval Insert, Eval Expr, Parse e SubstituteEccellente revisione dei metodi disponibili per costruire dinamicamente espressioni JSL.Padroneggia questo e tutto sarà abbastanza semplice.