2011-10-30 46 views
39

Tôi thấy hành vi này kỳ lạ và muốn người dùng có kinh nghiệm hơn để chia sẻ suy nghĩ và cách giải quyết của họ. Khi chạy mẫu mã bên dưới trong R:Gán NULL cho một phần tử danh sách trong R?

sampleList <- list() 
d<- data.frame(x1=letters[1:10],x2=1:10,stringsAsFactors=FALSE) 
for(i in 1:nrow(d)) 
     sampleList[[i]] <- d$x1[i] 

print(sampleList[[1]]) 
print(sampleList[[2]]) 
print(sampleList[[3]]) 
print(length(sampleList)) 
sampleList[[2]] <- NULL 
print(length(sampleList)) 
print(sampleList[[2]]) 
print(sampleList[[3]]) 

Yếu tố danh sách được dịch chuyển lên. Có lẽ đây là như mong đợi, nhưng tôi đang cố gắng thực hiện một chức năng mà tôi hợp nhất hai yếu tố của một danh sách và thả một. Tôi về cơ bản muốn mất chỉ mục danh sách đó hoặc có nó như NULL.

Có cách nào tôi có thể gán NULL cho nó và không thấy hành vi trên không?

Cảm ơn bạn đã đề xuất.

+0

Sẽ 'unlist' giúp trường hợp của bạn? –

+1

Bạn đang sử dụng sai R - cố gắng triển khai thêm vectơ, nếu không mã của bạn sẽ vẫn chậm, xấu xí và phản trực giác. – mbq

Trả lời

49

Câu hỏi hay.

Kiểm tra các R-FAQ:

Trong R, nếu x là một danh sách, sau đó x [i] < - NULL và x [[i]] < - NULL loại bỏ các yếu tố quy định từ x. Việc đầu tiên trong số này là không tương thích với S, nơi nó là một no-op. (Lưu ý rằng bạn có thể thiết lập các yếu tố để NULL sử dụng x [i] < - danh sách (NULL).)

xem xét ví dụ sau:

> t <- list(1,2,3,4) 
> t[[3]] <- NULL   # removing 3'd element (with following shifting) 
> t[2] <- list(NULL)  # setting 2'd element to NULL. 
> t 
[[1]] 
[2] 1 

[[2]] 
NULL 

[[3]] 
[3] 4 

UPDATE:

Như tác giả của the R Inferno nhận xét, có thể có nhiều tình huống tinh tế hơn khi giao dịch với NULL. Xem xét cấu trúc khá chung mã:

# x is some list(), now we want to process it. 
> for (i in 1:n) x[[i]] <- some_function(...) 

Bây giờ được nhận thức, rằng nếu some_function() lợi nhuận NULL, bạn có lẽ sẽ không có được những gì bạn muốn: một số yếu tố sẽ chỉ biến mất. bạn nên sử dụng chức năng lapply. Hãy xem ví dụ đồ chơi này:

> initial <- list(1,2,3,4) 
> processed_by_for <- list(0,0,0,0) 
> processed_by_lapply <- list(0,0,0,0) 
> toy_function <- function(x) {if (x%%2==0) return(x) else return(NULL)} 
> for (i in 1:4) processed_by_for[[i]] <- toy_function(initial[[i]]) 
> processed_by_lapply <- lapply(initial, toy_function) 
> processed_by_for 
    [[1]] 
    [1] 0 

    [[2]] 
    [1] 2 

    [[3]] 
    NULL 

    [[4]] 
    [1] 4 

> processed_by_lapply 
    [[1]] 
    NULL 

    [[2]] 
    [1] 2 

    [[3]] 
    NULL 

    [[4]] 
    [1] 4 
+14

Đây là Vòng 8.1.55 của 'The R Inferno' http://www.burns-stat.com/pages/Tutor/R_inferno.pdf Circle 8.1.56 là một phiên bản tinh tế hơn về điều này. –

+0

@Patric, tôi đã cập nhật câu trả lời theo nhận xét của bạn. – Max

+0

Cảm ơn bạn đã giải thích chi tiết. Làm thế nào để đọc hướng dẫn sử dụng và không bỏ qua những tinh tế này !!!! – harshsinghal

5

Câu hỏi của bạn hơi khó hiểu với tôi.

Gán null cho một đối tượng hiện có sẽ xóa đối tượng đó (ví dụ: có thể rất tiện dụng nếu bạn có khung dữ liệu và muốn xóa các cột cụ thể). Đó là những gì bạn đã làm. Tôi không thể xác định những gì nó là bạn muốn mặc dù. Bạn có thể thử

sampleList[[2]] <- NA 

thay vì NULL, nhưng nếu "Tôi muốn mất", bạn có nghĩa là xóa nó, sau đó bạn đã thành công. Đó là lý do tại sao, "Các yếu tố danh sách được dịch chuyển lên."

0
obj = list(x = "Some Value") 
obj = c(obj,list(y=NULL)) #ADDING NEW VALUE 
obj['x'] = list(NULL) #SETTING EXISTING VALUE 
obj 
+1

Điều này khác với câu trả lời được chấp nhận như thế nào? –

Các vấn đề liên quan