2012-06-20 4 views
5

Tôi có ví dụ sau:Xóa cột của một data.table bên trong một hàm

irisDT <- as.data.table(iris) 

mod <- function(dat) { 
    dat[, index:=(1:nrow(dat))] 
    setkey(dat, index) 

    dat <- dat[2:10] 

    dat[, index:=NULL] 
    invisible() 
} 

mod(irisDT) 
names(irisDT) # it contains index 

Trước sự ngạc nhiên của tôi, cột chỉ số vẫn còn tồn tại sau khi gọi hàm mod() . Đây không phải là trường hợp khi tôi xóa dòng dat <- dat[2:10]. Tôi đoán rằng, vì các hàng không thể bị xóa theo tham chiếu, một dữ liệu khác có thể được tạo. Tuy nhiên, tôi muốn xóa cột chỉ mục trong dữ liệu ban đầu.

+0

Vui lòng không bắt đầu tiêu đề của bạn bằng "R:"; đó là những gì các thẻ cho. –

+0

+1 đã tăng 100% trong cùng một vấn đề ngay hôm nay. – Beasterfield

Trả lời

5

Câu hỏi hay. data.table sao chép-on-thay đổi, theo <-, theo cách R thông thường.

Nó không phải là sao chép-on-change bởi := hoặc set* chức năng (setkey, setnames, setattr) được cung cấp bởi các gói data.table.

Vì vậy, không có gì đặc biệt về chính đối tượng data.table quyết định bản sao hay không, và nó được chuyển làm đối số cho các hàm theo đúng cách giống như data.frame. Đó là những gì bạn làm trên đó bên trong hàm đếm. <- bản sao của nhà điều hành-on-thay đổi và đó là không khác nhau khi được sử dụng trên một data.table. Mặt khác, toán tử := chỉ định bằng tham chiếu.

Như bạn nói, không có cách nào (chưa) để xóa các hàng theo tham chiếu, vì vậy cho đến khi đó bạn sẽ cần phải sử dụng cú pháp R chuẩn để gán bản sao trở lại biểu tượng trong phạm vi gọi.

Khi điều đó xảy ra, có một bản chiếu về điều này tại buổi nói chuyện LondonR đêm qua, hiện đang ở trên homepage trong phần trình bày (xem trang chiếu có tiêu đề copy()).

+1

Cảm ơn! Tôi sẽ sử dụng bản sao thực sự. –