2011-09-29 24 views
9

Trong quá trình (chủ yếu) trả lời câu hỏi this, tôi tình cờ gặp một điều gì đó mà tôi cảm thấy như tôi thực sự đã thấy trước đây. Hãy nói rằng bạn đã có một danh sách:Tại sao hành vi này khi co một danh sách đến ký tự thông qua as.character()?

l <- list(a = 1:3, b = letters[1:3], c = runif(3)) 

Cố gắng ép buộc l với các loại hình trả về một lỗi:

> as.numeric(l) 
Error: (list) object cannot be coerced to type 'double' 
> as.logical(l) 
Error: (list) object cannot be coerced to type 'logical' 

Tuy nhiên, tôi dường như được phép ép buộc một danh sách để nhân vật, tôi chỉ không ngờ kết quả này:

> as.character(l) 
[1] "1:3"               
[2] "c(\"a\", \"b\", \"c\")"          
[3] "c(0.874045701464638, 0.0843329173512757, 0.809434881201014)" 

Thay vào đó, nếu tôi được phép ép buộc danh sách để nhân vật, tôi đã có thể nghĩ rằng tôi muốn xem hành vi như thế này:

01.
> as.character(unlist(l)) 
[1] "1"     "2"     "3"     "a"     "b"     
[6] "c"     "0.874045701464638" "0.0843329173512757" "0.809434881201014" 

Lưu ý rằng làm thế nào tôi xác định các yếu tố danh sách ban đầu ảnh hưởng đến đầu ra của as.character:

l <- list(a = c(1,2,3), b = letters[1:3], c = runif(3)) 
> as.character(l) 
[1] "c(1, 2, 3)"             
[2] "c(\"a\", \"b\", \"c\")"          
[3] "c(0.344991483259946, 0.0492411875165999, 0.625746068544686)" 

Tôi có hai câu hỏi:

  1. như thế nào as.character nạo vét lên các thông tin từ tôi tạo bản gốc của danh sách l để nhổ ra 1:3 so với c(1,2,3).
  2. Trong trường hợp nào tôi muốn làm điều này, chính xác? Khi nào tôi muốn gọi as.character() trên danh sách và nhận kết quả đầu ra của biểu mẫu này?

Trả lời

7

Đối với danh sách không tầm thường, as.character sử dụng deparse để tạo chuỗi.

  1. Chỉ khi vectơ là số nguyên và 1,2,3, ..., n - sau đó nó deparses là 1:n.

    c(1,2,3) là đôi khi 1:3 là số nguyên ...

  2. Không có ý tưởng :-)

... nhưng nhìn vào deparse nếu bạn muốn hiểu as.character đây:

deparse(c(1L, 2L, 3L)) # 1:3 
deparse(c(3L, 2L, 1L)) # c(3L, 2L, 1L) 
deparse(c(1, 2, 3)) # c(1, 2, 3) 
+1

Aha,' deparse' dường như giải thích nhiều câu hỏi đầu tiên của tôi. – joran

6

Tệp trợ giúp có nội dung

For lists it deparses the elements individually, except that it extracts the first element of length-one character vectors.

Tôi đã thấy điều này trước khi cố gắng trả lời câu hỏi [không trực tuyến] về grep. Xem xét:

> x <- list(letters[1:10],letters[10:19]) 
> grep("c",x) 
[1] 1 2 

grep sử dụng as.character trên x, với kết quả đó, vì cả hai đều có c( trong đó, cả hai thành phần phù hợp. Phải mất một lúc để tìm ra.

Trên "Tại sao lại thực hiện việc này? ", tôi đoán rằng một trong những thành viên của R lõi muốn nó làm điều này.

+1

Đây là một lý do tại sao R, tuyệt vời như nó là để lập trình thống kê, sẽ không bao giờ bắt được bên ngoài cộng đồng hẹp của những người làm việc với nó độc quyền hoặc sẵn sàng dành một lượng năng lượng vô hạn để đối phó với hành vi không thể đoán trước của nó. –

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