Citazioni nell'espressione<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Supponiamo di voler concatenare un numero elevato di tabelle che hanno tutte lo stesso formato. Vorrei avere una singola chiamata per concatenare la funzione, piuttosto che un ciclo per concatenare una tabella di dati alla volta. Questo perché voglio imparare le espressioni in JMP.
Mi piacerebbe avere qualcosa del genere
Tabella dati("dt1") << concatenate(tabella dati("dt2"),tabella dati("dt3"),…, tabella dati("dt100"))
In questo esempio, creo copie degli stessi dati di esempio, ma immagino che possano provenire da origini diverse e contenere valori diversi.
chiudi tutto ( tabelle di dati , novanta ) ;
dt1 = Aprire ( "$SAMPLE_DATA/Big Class.jmp" ) ;
N = 100 ;
/*in questo ciclo, copio la tabella dati e creo una stringa, con l'obiettivo di usarla nella funzione concatena*/
/*Sto usando il carattere di escape perché ho le virgolette*/
stringa_dt = "" ;
per ( io = 2 , io <= N , io ++,
dt_tmp = ( dt1 << sottoinsieme ( tutte le righe , tutte le colonne , invisibile )) ;
dt_name = "dt" || car ( io ) ;
dt_tmp << imposta nome ( dt_name ) ;
Se ( stringa_dt == "" ,
stringa_dt = "tabella dati(\!"" || dt_name || "\!")" ;,
stringa_dt = stringa_dt || ", tabella dati(\!"" || dt_name || "\!")" ) ;
) ;
mostrare ( stringa_dt ) ;
concat_espr = espr ( dt1 << concatenare ( lista_dt )) ;
mostrare ( concat_espr ) ;
concat_espr2 = sostituto ( Nome espr ( concat_espr ) , espr ( lista_dt ) , stringa_dt ) ;
mostrare ( concat_espr2 ) ;
eval ( concat_espr2 ) ;
E il mio problema è che ho ancora il carattere di escape nell'espressione e la sua valutazione fallisce.
Per favore, potresti proporre un codice per costruire l'espressione corretta?
Grazie in anticipo.
JF
Re: Citazioni nell'espressionePer essere chiari, tutto il codice che ho offerto fino a "Show(tbls)" incluso era solo un modo rapido per creare un elenco di tabelle che puoi alimentare per concatenare.
Ma se vuoi rendere le cose invisibili, puoi fare:
// Apre un tavolo
dt1 = Aprire ( "$SAMPLE_DATA/Big Class.jmp" ) ;
dt1script = dt1 << getScript ;
Stampa ( dt1script ) ;
Inserire ( dt1script , espr ( Invisibile )) ;
Stampa ( dt1script ) ;
che, guarda caso, è un semplice esempio di come puoi manipolare le espressioni.
Re: Citazioni nell'espressioneGrazie ad entrambi per le risposte. Non sapevo che possiamo fornire elenchi per concatenare le funzioni.
La risposta della SM era esattamente quella che stavo cercando. Ero molto vicino.
Di seguito, organizzo le due opzioni per confrontare l'efficacia della stringa rispetto all'elenco.
L'opzione stringa richiede 2,85 secondi e l'opzione elenco richiede 4,38 secondi.
Possiamo velocizzare il codice rendendo invisibile la tabella dei dati. Con la funzione subset, posso facilmente aggiungere l'opzione invisibile. Ma con getscript, non so come farlo.
dt1 = Aprire ( "$SAMPLE_DATA/Big Class.jmp" ) ;
N = 100;
inizio = HP Time () ;
stringa_dt = "" ;
per ( io = 2 , io <= N , io ++,
dt_tmp = ( dt1 << sottoinsieme ( tutte le righe , tutte le colonne )) ;
dt_name = "dt" || car ( io ) ;
dt_tmp << imposta nome ( dt_name ) ;
Se ( stringa_dt == "" ,
stringa_dt = "tabella dati(\!"" || dt_name || "\!")" ;,
stringa_dt = stringa_dt || ", tabella dati(\!"" || dt_name || "\!")" ) ;
) ;
mostrare ( stringa_dt ) ;
concat_espr = espr ( dt1 << concatenare ( lista_dt )) ;
mostrare ( concat_espr ) ;
concat_espr2 = sostituto ( Nome espr ( concat_espr ) , espr ( lista_dt ) , analizzare ( "{" || stringa_dt || "}" )) ;
mostrare ( concat_espr2 ) ;
eval ( concat_espr2 ) ;
Per ( io = 2 , io <= N , io ++, Chiudere ( tabella dati ( "dt" || car ( io )) , NoSalva )) ;
fine = HP Time () ;
soluzione 1 = ( fine - inizio ) / 1e6 ; /*per avere secondi anziché microsecondi*/
inizio = HP Time () ;
dt1script = dt1 << getScript ;
tbl = {} ;
Per ( io = 2 , io <= N , io ++,
val ( dt1script ) ;
Inserire ( tbl , Tabella dati ( "Grande classe" || Char ( io ))) ;
) ;
Mostrare ( tbl ) ;
dt1 << Concatenare ( tbl ) ;
Per ( io = 1 , io <= NI articoli ( tbl ) , io ++, Chiudere ( tbl [ io ] , NoSalva )) ;
fine = HP Time () ;
soluzione2 = ( fine - inizio ) / 1e6 ; /*per avere secondi anziché microsecondi*/
Re: Citazioni nell'espressione(Per favore, evita di postare codice come chiudi tutto ( tabelle di dati , novanta ) ; Sono stato negligente e prima non riuscivo a capire cosa fosse successo a tutte le mie finestre aperte)
Sembra che tu abbia un mix di espressioni e stringhe. Ad un certo punto la stringa deve essere analizzata in codice eseguibile (preferibilmente un elenco in questo caso).
Il tuo codice dovrebbe funzionare correttamente se modifichi il file concat_espr2 assegnazione in questo:
concat_espr2 = sostituto ( Nome espr ( concat_espr ) , espr ( lista_dt ) , analizzare ( "{" || stringa_dt || "}" )) ;
Tuttavia suggerisco un approccio più semplice: saltare la stringa e costruire direttamente un elenco.
dt1 = Aprire ( "$SAMPLE_DATA/Big Class.jmp" ) ;
N = 10 ;
lista_dt = {} ;
Per ( io = 2 , io <= N , io ++,
dt_tmp = dt1 << sottoinsieme ( tutte le righe , tutte le colonne , invisibile ) ;
Inserire ( lista_dt , dt_tmp ) ;
) ;
dt1 << concatenare ( lista_dt ) ;
Re: Citazioni nell'espressioneDopo averlo letto due volte, penso che il tuo problema di "concatenare" sia solo un esempio per consentirti di approfondire l'uso delle espressioni.
In caso contrario, tieni presente che '<< Concatenate()' prenderà un elenco di tabelle, quindi non devi pasticciare con loro se vuoi semplicemente portare a termine il lavoro:
NomiDefaultToHere ( 1 ) ;
// Apre un tavolo
dt1 = Aprire ( "$SAMPLE_DATA/Big Class.jmp" ) ;
dt1script = dt1 << getScript ;
// Fai delle copie
n = 4 ;
tbl = {} ;
Per ( io = 1 , io <= n , io ++,
val ( dt1script ) ;
Inserire ( tbl , Tabella dati ( "Grande classe" || Char ( io + 1 ))) ;
) ;
Mostrare ( tbl ) ;
// Concatena le copie alla prima tabella - Puoi usare l'elenco delle tabelle, tbls
dt1 << Concatenare ( tbl , Aggiungi alla prima tabella ) ;
// Chiude tutto tranne il primo tavolo
Per ( io = 1 , io <= NI articoli ( tbl ) , io ++, Chiudere ( tbl [ io ] , NoSalva )) ; .