Perché usare sempre un'istruzione else e la differenza fondamentale tra valori vuoti e mancantiCiao a tutti,
una domanda un po' teorica qui. Attualmente sto scrivendo un tutorial sullo scripting JSL per i miei colleghi e quindi sto cercando di assicurarmi di avere una buona comprensione del modo in cui funziona JSL.
Una volta ho letto su un forum che dovresti sempre usare un'istruzione 'Else' all'interno di un ciclo 'If', anche se ciò significava aggiungere Empty() come istruzione 'Else'.
Per vedere la differenza, ho provato a giocare con l'editor di script:
y=if(1>2, 1);
z= if (1>2, 1 , Empty());
Show (y);
Show (z);
Show (Is Missing (y) );
Show (Is Missing (z) );
Show (Is Empty (y) );
Show (Is Empty (z) );
x= If (y==z, "true", "false");
Show (x); <BR /><BR />// results :<BR />y = .;<BR />z = Empty();<BR />Is Missing(y) = 1;<BR />Is Missing(z) = 1;<BR />Is Empty(y) = 0;<BR />Is Empty(z) = 1;<BR />x = .;
Quindi il valore Empty() è sia un valore mancante che un valore vuoto ma '.' è mancante ma non vuoto. Che differenza fa? Dato che entrambi restituiscono un valore mancante quando vengono utilizzati negli operatori di confronto, perché dovrei preoccuparmi di utilizzare Empty() come istruzione 'Else'?
Ciò illustra anche il fatto che quando la condizione testata nell'istruzione if restituisce missing, non è né vera né falsa, quindi il ciclo non restituisce nessuna delle due affermazioni, il che è sempre bene tenerlo a mente!
Ri: Perché usare sempre un'istruzione else e la differenza fondamentale tra valori vuoti e mancantiFWIW Non uso mai un'istruzione ELSE se non ho una condizione ELSE.Mantiene il mio codice semplice e stretto.Sono consapevole che if() è una funzione e so come usarla come tale.Forse è un residuo di altre lingue che ho usato.
Ri: Perché usare sempre un'istruzione else e la differenza fondamentale tra valori vuoti e mancantiConcordo sul fatto che la programmazione per computer in generale e lo scripting JMP in particolare siano argomenti seri. Salvare gli script e hackerare insieme gli script scritti da altri ti porterà solo lontano. Di solito ne derivano confusione e frustrazione.
Mi dispiace che la nostra formazione non sia un'opzione. Il nostro corso introduttivo è maturo (circa due decenni) e ben accolto. Non sono a conoscenza di altri corsi di formazione per JSL, gratuiti oa pagamento. Potrebbero esserci alcuni video gratuiti che trattano argomenti specifici, ma dubito che trasmettano la mentalità. Di solito sono uno stile "come fare" o "libro di cucina".
Forse un altro membro della community conosce la formazione adatta a te.
Ri: Perché usare sempre un'istruzione else e la differenza fondamentale tra valori vuoti e mancantiBeh, di sicuro non voglio limitare la mia creatività avendo una mentalità limitante. Immagino che probabilmente mi manchi la formazione in questo campo. Ho valutato Scripting in JSL alcuni mesi fa, per lo più iterando su script esistenti e guardando l'indice di scripting e il pdf della guida di scripting. Ora penso di aver bisogno di qualcosa di un po' più serio se voglio liberare il potenziale di JSL.
Conoscete risorse online (gratuite) per l'apprendimento di JSL? So che questa potrebbe essere una domanda complicata poiché sei un membro dello staff e la tua azienda offre corsi a pagamento, ma al momento questa non è un'opzione per me.
Ri: Perché usare sempre un'istruzione else e la differenza fondamentale tra valori vuoti e mancantiFai alcune grandi domande.
Il mio punto fondamentale è che, come con qualsiasi linguaggio di programmazione per computer, la sintassi e gli idiomi JSL sono nostri amici ma non ne siamo schiavi. La mia domanda, "Cosa ti aspetti?" intendeva solo sottolineare che abbiamo bisogno della risposta a questa domanda ogni volta che scriviamo o modifichiamo codice. Una risposta chiara fa la differenza per il nostro codice.
Sì, le funzioni sono un elemento chiave per scrivere script. Per definizione, ogni funzione restituisce un risultato. Ma a volte siamo più interessati a un effetto collaterale della funzione che al risultato che viene restituito. Ad esempio, la funzione V List Box() restituisce un riferimento all'oggetto casella di visualizzazione che crea. Potrei essere più interessato alla scatola stessa (l'effetto collaterale) che al riferimento.
Molti scripter alle prime armi pensano che If() e For() siano istruzioni o comandi. Sono funzioni. La mentalità dichiarativa può limitare la tua creatività. La mentalità è importante. Il seguente script mostra due approcci per realizzare la stessa cosa, ma il secondo approccio non verrebbe mai in mente a qualcuno con una mentalità da dichiarazione.
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
mean weight = Col Mean( dt:weight );
// assign within the If() function call
dt << New Column( "Condition 1", Numeric, Continuous );
For Each Row(
If( :weight < mean weight, dt:Condition 1 = -1, dt:Condition 1 = 1 );
);
// assign with the returned result from the If() function call
dt << New Column( "Condition 2", Numeric, Continuous );
For Each Row(
dt:Condition 2 = If( :weight < mean weight, -1, 1 );
);
Ri: Perché usare sempre un'istruzione else e la differenza fondamentale tra valori vuoti e mancantiCiao Markbayley,
Grazie per questi spunti
in effetti ho pensato che fosse strano dover usare Empty() come istruzione else. Ho provato a cercare il post che menzionava questa pratica ma non lo trovo più, quindi non posso chiedere all'utente perché pensa che sia utile.
In risposta alla tua domanda: cosa stai cercando di fare con la funzione condizionale If ()? Cosa ti aspetti che restituisca?
Bene, è facile dimenticare che JSL è un linguaggio basato sulle funzioni e che le funzioni restituiscono valori. Quindi, di solito, non uso davvero ciò che restituisce l'istruzione If. Stavo solo esplorando questo come un modo per comprendere i fondamenti di JSL. In pratica, mi chiedo, a che serve usare i valori restituiti da un'istruzione If?
Tutto quello a cui riesco a pensare è guadagnare spazio in una sceneggiatura o renderla un po' più veloce. Ma sembra che se provassi a essere intelligente in quel modo, tornerebbe a perseguitarmi più tardi e genererebbe errori / bug.
Qual è la tua opinione su questo?
Ri: Perché usare sempre un'istruzione else e la differenza fondamentale tra valori vuoti e mancantiIl modo in cui utilizzo Is Empty() è vedere se una variabile è mai stata assegnata.Evitando così un errore di sintassi per:
names default to here(1);
show(z);
si può verificare se la variabile "z" è mai stata referenziata:
Names Default To Here( 1 );
If( Is Empty( z ) == 0,
Show( z )
);
Un esempio migliore è quello qui sotto.
Names Default To Here( 1 );
x=1;
If( x > 2, z = 7 );
If( Is Empty( z ) == 0,
Show( z )
);
Poiché JSL è un linguaggio interpretato, segue il flusso logico del JSL Quindi, se x <= 2, JSL non eseguirà (nemmeno guarderà) z = 7, e quindi senza il controllo per vedere se z Is Empty() è richiesto poiché JSL darebbe un errore di sintassi.
Nel tuo esempio, stai usando una forma diversa di assegnazione del valore a z
names default to here(1);
z=(if(1>2, 7));
show(z);
La variabile z assumerà il valore 7 se 1>2, ma se non è vera, z non è più non assegnata, quindi assumerà un valore mancante, ".".Il vantaggio qui è che una volta effettuata l'assegnazione, JSL ha elaborato la variabile z e non avrà un errore di sintassi se si fa riferimento a z successivamente nel flusso del programma.
Questo ci porta alla domanda se si dovrebbe assegnare Empty() come risultato di un falso restituito in una funzione If().
names default to here(1);
z=(if(1>2, 7, Empty()));
show(z);
Quindi si riduce semplicemente a, non vuoi avere z come valore mancante e preferiresti controllare Is Empty() vs. Is Missing().Personalmente preferisco il percorso del valore mancante, poiché lascia Empty() come verifica che z non è mai stato assegnato. .
Ri: Perché usare sempre un'istruzione else e la differenza fondamentale tra valori vuoti e mancantiScrivo sceneggiature da più tempo della maggior parte delle persone (1998). Sono un autore e insegno a tutti i nostri corsi di scripting. Non sono a conoscenza di una "best practice" che raccomandi di includere sempre un argomento per la condizione "else" o di utilizzare vuoto nei casi in cui non esiste un valore di ritorno specifico. Di certo non l'ho mai perso o pagato per non usarlo. Penso che questo problema sia un altro caso di "dipende". Cosa stai cercando di fare con il condizionale Se() funzione? Cosa ti aspetti che restituisca?
Il valore restituito predefinito di Se() funzione è mancante quando il primo argomento restituisce false e ci sono solo due argomenti. Hai dimostrato questo comportamento con il valore memorizzato in si . IL Se() funzione si è comportata come tale da quando JSL è stato introdotto per la prima volta in JMP 4 nel 2000.
Puoi fornire un terzo argomento al file Se() funzione che viene valutata e restituita quando il primo argomento viene valutato come falso. Hai dimostrato questo comportamento con il valore memorizzato in z.z dove hai fornito il file Vuoto() funzione come terzo argomento.
Mancante rappresenta un valore sconosciuto. Nella maggior parte dei casi rappresenta valori di dati sconosciuti o il risultato della valutazione di un'espressione numerica impossibile come Log( -1 ). penso che mancante ha molto senso come valore di ritorno predefinito per una condizione che non è rappresentata da un argomento.
Vuoto è solo questo. Rappresenta lo stato in cui non c'è niente lì. Ad esempio, se chiami Tabella dati corrente() senza argomenti quando non ci sono tabelle di dati aperte, restituisce vuoto .