2013-05-15 16 views
6

Quando si scrive un'espressione che opera in j su un data.table, .SD non contiene tutte le colonne nella tabella ma solo quelle utilizzate dall'espressione. Questo va bene per l'esecuzione di cose ma non è fantastico per il debug. Qual è il modo migliore per vedere tutte le colonne? Posso passare tutti i nomi a .SDcols ma questo sembra abbastanza noioso. Es:.SD colonne in data.table in R

x = data.table(a=1:10, b=10:1, id=1:5) 
x[,{ browser(); a+1},by=id] 
Called from: `[.data.table`(x, , { 
    browser() 
    a + 1 
}, by = id) 
Browse[1]> n 
debug at #1: a + 1 
Browse[1]> .SD 
    a 
1: 1 
2: 6 

risposta

6

Per fare tutti colonne disponibili .SD s', basta fare riferimento a esso da qualche parte nel vostro j espressione. Ad esempio, provate questo:

x[,{.SD; browser(); a+1},by=id] 
# Called from: `[.data.table`(x, , { 
#  .SD 
#  browser() 
#  a + 1 
# }, by = id) 
Browse[1]> .SD 
# a b 
# 1: 1 10 
# 2: 6 5 

Questo funziona perché, as explained here

[.data.table() [...] prevede l'espressione j non valutata, e aggiunge solo .SD colonne che sono qui nominati. Se lo stesso .SD viene menzionato, aggiunge tutte le colonne di DT.


In alternativa, se non si vuole sostenere la spesa di colonne 's carico .SD per ogni calcolo by-gruppo, si può sempre controllare il sottoinsieme attualmente caricata di x chiamando x[.I,]. (.I è una variabile che memorizza le posizioni delle righe nel x del gruppo corrente):

x[,{browser(); a+1},by=id] 
# Called from: `[.data.table`(x, , { 
#  browser() 
#  a + 1 
# }, by = id) 
Browse[1]> x[.I,] 
# a b id 
# 1: 1 10 1 
# 2: 6 5 1 
+0

fresco, esattamente quello che volevo. Grazie – Alex

Problemi correlati