2013-01-08 13 views
7

To może być błąd. W takim przypadku usuniemy to pytanie i zgłoszę jako błąd. Chciałbym, aby ktoś się przekonał, że nie robię czegoś niepoprawnie, więc nie marnuję czasu programisty.szybkie dołączanie danych.tabela (potencjalny błąd, sprawdzanie przed zgłoszeniem)

test = data.table(mo=1:100, b=100:1, key=c("mo", "b")) 
mo = 1 
test[J(mo)] 

która zwraca całą test data.table zamiast prawidłowego wyniku zwróconego przez

test[J(1)] 

Wierzę, że błąd może być pochodzących z test o tej samej nazwie kolumny jako tabeli, które jest połączone autor: mo. Czy ktoś inny ma ten sam problem?

+1

Nie mogę wyjaśnić zachowania, ale fwiw: 'foo = 1; test [J (foo)] 'przyniósł oczekiwane rezultaty. To samo dotyczy 'test [mo]' i 'mo = data.table (1); przetestuj [mo] '. – Justin

+0

Również "identyczny (test [J (1)], test [J (mo <- 1)])" daje "TRUE". – Ryogi

Odpowiedz

9

Jest to kwestia określania zakresu, podobny do omówionego w data.table-faq 2.13 (warning, pdf). Ponieważ test zawiera kolumnę o nazwie mo, gdy oszacowano wartość J(mo), zwraca ona całą kolumnę, a nie wartość mo znalezioną w środowisku globalnym, którą maskuje. (To zachowanie scoping jest, oczywiście, dość ładny gdy chcesz zrobić coś takiego test[mo<4]!)

Sposoby zobaczyć co się dzieje:

test <- data.table(mo=1:5, b=5:1, key=c("mo", "b")) 
mo <- 1 
test[browser()] 
Browse[1]> J(mo) 
# mo 
# 1: 1 
# 2: 2 
# 3: 3 
# 4: 4 
# 5: 5 
# Browse[1]> 

Jak sugerowano w połączonej FAQ , prostym rozwiązaniem jest zmiana nazwy zmiennej indeksowania:

MO <- 1 
test[J(MO)] 
# mo b 
# 1: 1 6 

(będzie również pracować ze względów omówionych w dokumentacji i w ?data.table):

mo <- data.table(1) 
test[mo] 
# mo b 
# 1: 1 6 
4

To nie jest błąd, ale udokumentowane zachowanie afaik. Jest to kwestia określania zakresu:

test[J(globalenv()$mo)] 
    mo b 
1: 1 100 
Powiązane problemy