Trasposizione di una tabella con argomenti personalizzati<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Sto cercando di trasporre una tabella con un nome di colonna Label noto, ma i nomi di colonna Transpose sono noti solo in fase di esecuzione. Ho cercato per ore di capire come farlo, ma il compito è molto complicato da JSL che confonde il comando Transpose per la funzione Transpose matrix e l'argomento Columns () ad esso per la funzione che ottiene i nomi di tutte le colonne in la tavola. Nel seguente codice, le colonne della lista sono popolate con i nomi delle colonne che voglio trasporre.
// Crea l'espressione transpose
transposeExpr = Expr (Transpose (Columns (), Label (: Wt or Rd)));
// Tirare fuori l'espressione dell'argomento Columns (questo mi impedisce di doverlo creare da solo e scambiarlo per la funzione Columns ())
columnsExpr = Arg (transposeExpr, 1);
Per (i = 1, i <= numColumns, i ++,
Insert Into (columnsExpr, Name Expr (As Column (colNames) )));
);
Rimuovi da (transposeExpr, 1);
Insert Into (transposeExpr, Name Expr (columnsExpr), 1);
cdt = Current Data Table ();
cdt << Transpose (Nome Expr (columnsExpr), Label (: Wt o Rd));
Tuttavia, questo non sembra funzionare perché columnsExpr continua a valutare un elenco di nomi di tutte le colonne nella tabella corrente, piuttosto che l'argomento Columns con riferimenti effettivi alla tabella. (Penso che interpreti questi riferimenti sono argomenti a colonne la funzione)
Qualcuno può spiegare cosa sto sbagliando?
Ri: Trasposizione di una tabella con argomenti personalizzati1. Transpose (Columns () .... ) prevede un gruppo di nomi di colonna separati da virgole, come si farebbe manualmente. Non si aspetta il nome di una lista e non sa come estrarre le informazioni dal nome della lista che contiene i nomi delle colonne di interesse. La funzione eval colma il vuoto. Ecco come vedo il problema, ma qualcun altro potrebbe avere un modo tecnicamente più preciso di spiegarlo.
2. Colonna () contro As Column: non sono sicuro di come si differenziano. I brevi esempi nei documenti li fanno sembrare intercambiabili in funzione. Mi interesserebbe che qualcuno possa indicare le differenze tra loro.
Ri: Trasposizione di una tabella con argomenti personalizzatiQuesto sembra funzionare. Lo faccio:
colList = List ();
Per (i = 1, i <= numColumns, i ++,
Insert Into (colList, Column (colNames ));
);
cdt = Current Data Table ();
cdt << Transpose (Columns (Eval (colList)), Label (: Wt or Rd));
Perché devo eseguire l'eval su colList nel messaggio finale? Qual è la differenza tra Column () e As Column ()?
Ri: Trasposizione di una tabella con argomenti personalizzatiNon sono sicuro se capisco esattamente cosa vuoi fare, ma forse questo esempio sarebbe utile, assumendo che i dati di fitness siano aggiornati.
collist = {: Age,: Oxy,: Runtime};
Tabella dati ("Fitness") << Transpose (
colonne (eval (collist)),
Etichetta (: nome),
Tabella di risultati ("Transpose of Fitness")
)
Ri: Trasposizione di una tabella con argomenti personalizzatiQuando ho problemi come questo, ricorro a costruire una stringa in modo dinamico, eseguendola con eval (parse ()). È una forza un po 'bruta, ma mi legano in nodi con tutte le varie funzioni come expr, eval, parse, nome expr, ecc.
Questo dovrebbe farlo:
transposeStr = "cdt << Transpose (Columns (" ;
Per ( io = 1 , io <= numColonne , io ++,
transposeStr = transposeStr || ":" || colNames [ io ] || "," ;
) ;
// Rimuovi l'ultima virgola
clen = lunghezza ( transposeStr ) ;
transposeStr = substr ( transposeStr , 1 , ( clen - 2 )) ;
// Aggiungi l'argomento label
transposeStr = transposeStr || "), Etichetta (: Wt o Rd))" ;
eval ( analizzare ( transposeStr )) ;