Posso utilizzare una stringa concatenata come argomento di una funzione?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Considera questo semplice esempio:
dt2 = tabella dati corrente();
b = 140;
bc = carattere(b);
stampa(b);
stampa(bc);
dt2 << Nuova colonna("intervallo"||bc||"v1",
Numerico,
Formula(b)
);
// dt2 = tabella dati corrente();
dt2 << Nuova colonna("Intervallo",
Numerico,
Formula(Massimo(:Nome("AA"||bc), :Nome("BB"||bc), :Nome("CC"||bc)) - Minimo(:Nome("AA"||bc) , :Nome("BB"||bc), :Nome("CC"||bc)))
);
Questa è la tabella:

Messaggio di errore restituito:

Faccio pochissima programmazione JSL, quindi per favore aiutatemi!!Mi piacerebbe che funzionasse.
Ri: Posso utilizzare una stringa concatenata come argomento di una funzione?Ops, mi dispiace! Codifica JSL a tarda notte Sembra che Craige abbia colto l'errore tra parentesi che causava quel problema e abbia anche semplificato le cose (grazie Craige !).
Giuliano
Ri: Posso utilizzare una stringa concatenata come argomento di una funzione?Ciao Craige,
Lo proverò.Penso che il motivo per cui mi sono ritrovato con Name() nello script è che l'ho copiato direttamente dall'editor di formule per una formula diversa.E ora penso di vedere il problema con le parentesi.
Grazie!
Ri: Posso utilizzare una stringa concatenata come argomento di una funzione?Ciao Giuliano,
Ho provato il tuo script e sembra funzionare parzialmente.Quando l'ho eseguito, ho ottenuto questo:

il valore sotto la colonna Intervallo dovrebbe essere 5, non 15.
e il registro diceva questo (che non capisco):

Sembra che il massimo venga valutato correttamente, e poi ci si ferma lì.Qualche idea?Grazie per l'aiuto
sceneggiatura:
dt2 = tabella dati corrente();
b = 140;
bc = carattere(b);
stampa(b);
stampa(bc);
dt2 << Nuova colonna("bias"||bc||"v1",
Numerico,
Formula(b)
);
// dt2 = tabella dati corrente();
dt2 << Nuova colonna("Intervallo",
Numerico,
);
eval(parse(EvalInsert(
"\[
:Intervallo << Imposta formula( Massimo(:Nome("^"AA_"||bc^"), :Nome("^"BB_"||bc^"), :Nome("^"CC_"||bc )^") -
Minimo(:Nome("^"AA_"||bc^"), :Nome("^"BB_"||bc^"), :Nome("^"CC_"||bc^"))
)
]\")));
Ri: Posso utilizzare una stringa concatenata come argomento di una funzione?Qualche informazione in più per dare seguito alla risposta di Julian.
Sì, puoi utilizzare la concatenazione per creare un argomento per la maggior parte delle funzioni.Il nome è una delle eccezioni davvero strane; Name() è un helper di analisi, non una funzione di runtime.
La maggior parte dei nomi delle variabili JSL sono ben formati, una sequenza di lettere, numeri, trattini bassi e spazi facilmente comprensibili dal parser di JMP.I vostri nomi, AA_140 , ecc., sono ben formati.A volte i nomi delle variabili risultano confusi.In genere ciò accade con virgole o segni meno incorporati: raggi X O mele, pere .Non puoi scrivere un'espressione JSL con questi nomi di variabili senza virgolette, in qualche modo. Il wrapper Name() fa proprio questo:
nome("radiografia") + nome("mele,pere")
aggiungerà le due variabili insieme.Il nome viene elaborato (non eseguito) quando il codice sorgente JSL viene analizzato, non quando viene eseguito.L'argomento di Nome deve essere una stringa semplice in fase di analisi.Il codice di Julian utilizza le funzioni dei caratteri di JMP per precostruire la stringa concatenata e inviarla alla funzione di analisi.
Poiché i nomi delle variabili sono ben formati (sempre una buona idea), il wrapper del nome non è necessario e l'idea di Julian può essere semplificata ancora di più.(Questo risolve anche una parentesi fuori posto.)
eval(parse(EvalInsert(
"\[
:Intervallo << Imposta formula(
Massimo(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) -
Minimo(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) )
]\")));

Esistono altre funzioni JSL per manipolare direttamente le formule, senza creare e analizzare stringhe di caratteri, ma l'idea EvalInsert di Julian ti consente di utilizzare la manipolazione intuitiva dei caratteri in JSL.
Ri: Posso utilizzare una stringa concatenata come argomento di una funzione?CIAO shehzaad.kaka ,
Sono riuscito a farlo funzionare costruendo un'espressione con eval, parse e eval insert. Dato che hai detto che sei nuovo in JSL, immagino che sembrerà piuttosto criptico, quindi lasciami esaminare due parti importanti di questo.
La prima cosa che ho fatto è stata spostare l'impostazione della formula in una parte separata, separata dalla creazione della colonna. In questo modo possiamo concentrarci sulla creazione di un'espressione solo per impostare la formula della colonna. La maggior parte di questo è ciò che Eval(Parse(EvalInsert())); sta facendo.EvalInsert è uno strumento accurato per prendere una stringa e sostituirla in variabili o funzioni di variabili. Il modo per indicare che si desidera una sostituzione è avvolgendo ^ ^ attorno alla funzione o alla variabile. Ad esempio:
g = "Mondo";
h = EvalInsert("Ciao ^g^ ");
Didascalia(h);
h in questo caso sarebbe uguale a "ciao mondo", che è ciò che verrà visualizzato in una casella di didascalia con il codice sopra.
Nella tua situazione, ho usato evalInsert per i nomi delle colonne:
:Nome("^"AA_"||bc^")
Se lo smontiamo sarà più chiaro
:Nome(" ^ "AA_" || bc ^ ")
La funzione :Name() richiede testo tra virgolette, quindi ci sono virgolette all'inizio e alla fine tra parentesi. Successivamente, abbiamo ^ ^ avvolto attorno alla tua concatenazione. Evalinsert lo elabora e la funzione :Name() viene lasciata con una stringa tra virgolette di AA_140. EvalInsert sostituirà ovunque sia racchiuso qualcosa ^ ^. C'è una complicazione speciale: l'espressione che stiamo costruendo deve contenere virgolette, ma dobbiamo usare le virgolette per designare la stringa stessa. Per gestire questa situazione, possiamo dire a JMP che ogni virgoletta è in realtà intesa come carattere di virgoletta (piuttosto che come parte della sintassi di JMP) anteponendo ciascuna virgoletta con \! (slash-bang) oppure fai come ho fatto di seguito e metti \[ dopo la virgoletta iniziale e ]\ prima della virgoletta finale. Questo "sfugge" a tutte le virgolette nell'espressione che stiamo costruendo.
Successivamente, Parse() converte la stringa di caratteri in un'espressione JSL e infine Eval() esegue l'espressione JSL, assegnando la formula alla colonna.
Spero che aiuti!
Giuliano
ps: il tuo codice non aveva i caratteri di sottolineatura per i nomi delle colonne, quindi li ho aggiunti.
dt2 = tabella dati corrente () ;
B = 140 ;
avanti Cristo = car ( B ) ;
stampa ( B ) ;
stampa ( avanti Cristo ) ;
dt2 << Nuova colonna ( "allineare" || avanti Cristo || "v1" ,
Numerico ,
Formula ( B )
) ;
// dt2 = tabella dati corrente();
dt2 << Nuova colonna ( "Allineare" ,
Numerico ,
) ;
eval ( analizzare ( EvalInsert (
"\[
:Intervallo << Imposta formula( Massimo(:Nome("^"AA_"||bc^"), :Nome("^"BB_"||bc^"), :Nome("^"CC_"||bc )^") - Minimo(:Nome("^"AA_"||bc^"), :Nome("^"BB_"||bc^"), :Nome("^"CC_"||bc^" ))
)
]\" ))) ;