2013-05-15 18 views
6

Podczas pisania wyrażenie, które działa w j na data.table, .SD nie zawiera wszystkich kolumn w tabela, ale tylko te, których wyrażenie używa. Jest to przydatne do uruchamiania programów, ale nie jest świetne do debugowania. Jaki jest najlepszy sposób, aby zobaczyć wszystkie kolumny? Mogę podać wszystkie nazwiska do .SDcols, ale wydaje się to dość nudne. Ex:.SD kolumn w data.table w 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 

Odpowiedz

6

aby wszystkie kolumny .SD „s dostępne, wystarczy odwołać go gdzieś w swojej wypowiedzi j. Na przykład, spróbuj tego:

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 

To działa, ponieważ as explained here

[.data.table() [...] do podglądu unevaluated wyraz j, a jedynie dodaje do .SD kolumny, które są z nim związanych. Jeśli wspomniano o .SD, dodaje wszystkie kolumny DT.


Alternatywnie, jeśli nie chcą ponosić koszt załadunku .SD „s kolumn dla poszczególnych obliczeń ubocznych grupie, zawsze można sprawdzić aktualnie załadowany podzbiór x wywołując x[.I,]. (.I to zmienna, która przechowuje lokalizacje wiersz x obecnej grupy):

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

cool, dokładnie to, co chciałem. dzięki – Alex