<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Mi viene spesso chiesto come scrivere una formula (applicare la stessa formula a più colonne, utilizzando qualcosa sulla colonna di riferimento nella formula). Di solito questo è un punto di ingresso in cui anche le persone possono iniziare a scrivere script, quindi sono principianti.
Recentemente ho pubblicato una domanda nella sezione di discussione regolare, cercando sia di convincere il mio cliente a partecipare (non l'hanno fatto) sia di qualche consiglio di esperti (chiunque legga questo). Mi piacerebbe davvero generare una risposta solida a cui poter indirizzare le persone quando si presenta questa domanda. Ad esempio, la risposta suggerita è davvero il modo migliore per farlo se hai più di 1000 colonne, ecc.?
Qualsiasi aiuto su questo sarebbe apprezzato. O un post sul blog. O sottolineare che questo è stato trattato da qualche altra parte?
La discussione regolare è qui:
Il modo migliore per scrivere una formula di colonna in molte colonne?
Grazie!
In seguito a quanto precedente: noterai che utilizzo la funzione :Name() per i nomi delle colonne. Ciò aiuta a evitare eventuali problemi derivanti dalla presenza di caratteri interessanti nei nomi delle colonne. Non sempre necessario, ma ancora una volta, a prova di proiettile.
Seguendo ciò che ha detto Don, mi ritrovo spesso a fare un ulteriore passo avanti, utilizzando Eval(Parse(Substitute())).
Si tratta, in effetti, di scrivere il codice in modo dinamico. Sebbene in qualche modo inelegante, è quasi a prova di proiettile. Questo costrutto non è sempre il più efficiente (a causa delle sostituzioni dei caratteri), ma è quello che ha successo quando tutti gli altri trucchi falliscono, quindi è bene conoscerlo. Lo svantaggio più significativo è che non è possibile vedere il codice colore a causa della citazione:
Nomi predefiniti qui ( 1 ) ;
dt = aprire ( "$Dati_campione/calcio.jmp" ) ;
codeFrag = "\[
Nuova colonna("_colName_ Rango dalla media",
Numerico,
"Continuo",
Formato( "Migliore", 12 ),
Formula( Col Rank( Abs( Col Mean( :Name( "_colName_" )) - :Name( "_colName_" ) ) ) )
)
]\" ;
colList = dt << getcolumnnames ( corda ) ;
per ( io = 1 , io <= nitems ( collisione ) , io ++,
Se ( colonna ( dt , colList [ io ]) << ottenere il tipo di modellazione == "Continuo" ,
eval ( analizzare ( sostituire ( codeFrag , "_colNome_" , colList [ io ])))
)
) ;
Se la mancanza di codifica a colori ti dà fastidio, puoi mantenerla racchiudendo la stringa in un costrutto char(nameexpr()), come di seguito. Ciò aggiunge complessità ma potrebbe valerne la pena mentre si scrive il codice a scopo di debug... una volta che funziona puoi sempre eliminare il pezzo char(nameexpr()) e inserirlo tra virgolette utilizzando "\[ ]\".
In conclusione: questo non vincerà un concorso di bellezza, ma quando scrivi tu stesso la stringa, la analizzi e la valuti, otterrai quello che cerchi. Tienilo nella tasca posteriore dei pantaloni per quando Eval(EvalExpr( ...... Expr() .... )) fallisce e non sei in grado di capire (o non hai il tempo di capire, o non ti interessa) perché.
Nomi predefiniti qui ( 1 ) ;
dt = aprire ( "$Dati_campione/calcio.jmp" ) ;
codeFrag = car ( nomeespr (
Nuova colonna ( "_colName_ Classifica dalla media" ,
Numerico ,
"Continuo" ,
Formato ( "Migliore" , 12 ) ,
Formula ( Col Rango ( Addominali ( Col Mean ( : Nome ( "_colNome_" )) - : Nome ( "_colNome_" ) ) ) )
)
)) ;
colList = dt << getcolumnnames ( corda ) ;
per ( io = 1 , io <= nitems ( collisione ) , io ++,
Se ( colonna ( dt , colList [ io ]) << ottenere il tipo di modellazione == "Continuo" ,
eval ( analizzare ( sostituire ( codeFrag , "_colNome_" , colList [ io ])))
)
) ;
Saluti,
Brady
Laura,
Penso che la risposta data nel Forum sia un approccio solido che non complica il codice più del necessario. Penso che l'uso di Expr e Name Expr sia inevitabile in questa situazione. Come passaggio successivo, potresti prendere in considerazione la rimozione della formula dal ciclo per rendere il codice più generico. In questo modo è possibile creare una funzione che accetta delle formule come argomento (vedi JSL allegato). Probabilmente c'è un modo più semplice per farlo, ma sono così abituato a usare Substitute (ed è estremamente robusto). Non sono sicuro del motivo per cui è necessaria la parte [Row()], ma lo è per ogni volta che fai riferimento a una colonna tranne che all'interno di una funzione di colonna statistica. Spero che questo fornisca alcune informazioni.
Assistente