2013-01-08 24 views
7

Đây có thể là lỗi. Trong trường hợp đó, tôi sẽ xóa câu hỏi này và báo cáo là lỗi. Tôi muốn ai đó xem xét để đảm bảo rằng tôi không làm điều gì đó không chính xác vì vậy tôi không lãng phí thời gian của nhà phát triển.tham gia nhanh dữ liệu.table (lỗi tiềm năng, kiểm tra trước khi báo cáo)

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

Đó trả toàn bộ test data.table thay vì kết quả đúng được trả về bởi

test[J(1)] 

tôi tin rằng các lỗi có thể đến từ test có tên cùng một cột như bảng hiện đang được gia nhập bởi, mo. Có ai khác có cùng một vấn đề không?

+1

Tôi không thể giải thích hành vi, nhưng fwiw: 'foo = 1; kiểm tra [J (foo)] 'có kết quả mong đợi. Điều này cũng đúng với 'test [mo]' và 'mo = data.table (1); kiểm tra [mo] '. – Justin

+0

Ngoài ra, 'giống hệt nhau (kiểm tra [J (1)], kiểm tra [J (mo <- 1)])' cho 'TRUE'. – Ryogi

Trả lời

9

Đây là vấn đề về phạm vi, tương tự như vấn đề được thảo luận trong data.table-faq 2.13 (warning, pdf). Bởi vì test chứa một cột có tên là mo, khi J(mo) được đánh giá, nó trả về toàn bộ cột đó, chứ không phải giá trị của số mo được tìm thấy trong môi trường toàn cầu mà nó che dấu. (Hành vi Phạm vi này là, tất nhiên, khá đẹp khi bạn muốn làm một cái gì đó giống như test[mo<4]!)

Hãy thử này để thấy gì đang xảy ra:

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]> 

Như đã đề cập trong câu hỏi thường gặp liên quan , một giải pháp đơn giản là đổi tên biến chỉ mục:

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

(Điều này cũng sẽ làm việc, vì lý do được thảo luận trong tài liệu của i trong ?data.table):

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

Đây không phải là lỗi, nhưng hành vi được ghi lại. Đó là vấn đề phạm vi:

test[J(globalenv()$mo)] 
    mo b 
1: 1 100 
Các vấn đề liên quan