<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Spesso mi viene chiesto come scrivere una formula (applicare la stessa formula a più colonne, usando qualcosa sulla colonna di riferimento nella formula). Questo di solito è un punto di accesso anche per le persone che iniziano a scrivere script, quindi sono principianti.
Di recente ho pubblicato una domanda nella normale sezione di discussione, cercando sia di far partecipare il mio cliente (non l'hanno fatto) sia di alcuni consigli di esperti (chiunque legga questo). Mi piacerebbe davvero generare una risposta solida a cui 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 sottolineando 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 al precedente: noterai che uso la funzione: Name () per i nomi delle colonne. Questo aiuta a evitare problemi derivanti dall'avere caratteri interessanti all'interno dei nomi delle colonne. Non sempre necessario, ma ancora una volta, a prova di proiettile.
Seguendo ciò che ha detto Don, spesso mi ritrovo a fare un ulteriore passo avanti, usando Eval (Parse (Substitute ())).
Questo, in effetti, sta effettivamente scrivendo il codice dinamicamente. Anche se un po 'inelegante, è quasi a prova di proiettile. Questo costrutto non è sempre il più efficiente (a causa delle sostituzioni di caratteri), ma è quello che riesce quando tutti gli altri trucchi falliscono, quindi è bene saperlo. Lo svantaggio più significativo è che non puoi vedere la codifica dei colori a causa della citazione:
Nomi predefiniti qui ( 1 ) ;
dt = Aperto ( "$ Sample_Data / football.jmp" ) ;
codeFrag = "\ [
Nuova colonna ("_colName_ Rank from mean",
Numerico,
"Continuo",
Formato ("Migliore", 12),
Formula (Col Rank (Abs (Col Mean (: Name ("_colName_")) -: Name ("_colName_"))))
)
] \ " ;
colList = dt << getcolumnnames ( corda ) ;
per ( io = 1 , io <= nitems ( collista ) , io ++,
Se ( colonna ( dt , colList [ io ]) << ottenere il tipo di modellazione == "Continuo" ,
eval ( analizzare ( sostituto ( codeFrag , "_colName_" , colList [ io ])))
)
) ;
Se la mancanza di codici colore ti dà fastidio, puoi mantenerla avvolgendo la stringa in un costrutto char (nameexpr ()), come sotto. Ciò aggiunge complessità ma può valerne la pena mentre si scrive il codice per scopi di debug ... una volta che funziona, è sempre possibile rimuovere il pezzo char (nameexpr ()) e inserirlo tra virgolette usando "\ [] \".
Conclusione: questo non vincerà un concorso di bellezza, ma quando scrivi tu stesso la stringa, la analizzi e la valuti, otterrai quello che stai cercando. Tienilo nella tasca posteriore dei pantaloni per quando Eval (EvalExpr (...... Espr () ....)) 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 = Aperto ( "$ Sample_Data / football.jmp" ) ;
codeFrag = char ( nameexpr (
Nuova colonna ( "_colName_ Rank from mean" ,
Numerico ,
"Continuo" ,
Formato ( "Migliore" , 12 ) ,
Formula ( Col Rank ( Addominali ( Col Mean ( : Nome ( "_colName_" )) - : Nome ( "_colName_" ) ) ) )
)
)) ;
colList = dt << getcolumnnames ( corda ) ;
per ( io = 1 , io <= nitems ( collista ) , io ++,
Se ( colonna ( dt , colList [ io ]) << ottenere il tipo di modellazione == "Continuo" ,
eval ( analizzare ( sostituto ( codeFrag , "_colName_" , 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 considerare di rimuovere la formula dal ciclo per rendere il codice più generico. In questo modo, puoi creare una funzione che prende le 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 la parte [Row ()] è necessaria, ma è 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.
don