2015-04-10 16 views
8

Trên bề mặt, cả hai dường như đang làm điều tương tự. Nhưng có vẻ như trường hợp sau as(,"character") mạnh hơn.Sự khác biệt giữa as.character() và (, "ký tự") trong R

Như một ví dụ xem xét như sau:

library(rvest) 

temp <- html("http://www.example.com/") 
temp <- temp %>% html_node("div p") 

str(temp) 
#Classes 'XMLInternalElementNode', 'XMLInternalNode', 'XMLAbstractNode' <externalptr> 

as.character(temp) 
#Error in as.vector(x, "character") 
# cannot coerce type 'externalptr' to vector of type 'character' 

Trong khi as(temp, "character") cho

#[1] "<p>This domain is established to be used for illustrative examples in documents. You may use this\n domain in examples without prior coordination or asking for permission.</p>" 

Trả lời

9

as.character() là một S3 chung chung, trong khi as() là một hàm được định nghĩa trong gói phương pháp cho generics và phương pháp S4.

Tác giả của một lớp S3 không có lý do gì để viết một phương pháp ép buộc S4, vì vậy cho intance

> as.data.frame(matrix(integer())) 
[1] V1 
<0 rows> (or 0-length row.names) 

nhưng

> as(matrix(integer()), "data.frame") 
Error in as(matrix(), "data.frame") : 
    no method or default for coercing "matrix" to "data.frame" 

Đối với các lớp học S4, một (tức là, các nhà phát triển gói) có thể (và thực sự nên) viết cả hai phương thức S3 và S4 để ép buộc các lớp cụ thể; một mô hình chung là

as.character.MyClass <- function(x, ...) {} 
setAs("MyClass", "character", 
     function(from) as.character.MyClass(from)) 

Trong ví dụ của bạn, tác giả (XML) đã cung cấp một chức năng setAs mà không có sự tương đương S3, vì vậy bạn sẽ có được đối xử đặc biệt sử dụng as(), nhưng mặc định (ví dụ: lỗi) khi sử dụng as.character().

Không có quy tắc chung nào về 'mạnh mẽ hơn'; nó sẽ không ngạc nhiên khi tìm thấy các ví dụ ngay cả trong cơ sở R và gói phương thức mà as.X và as (, "X") hoạt động khác nhau và thậm chí theo một cách không hợp lý về mặt logic.

Trong phiên bản tiếp theo của R (3.2.0), bạn sẽ có thể nói

> methods(class=class(temp)) 
[1] [[   coerce  html_form html_node html_nodes html_table 
[7] initialize show  slotsFromS3 
see '?methods' for accessing help and source code 

nơi 'ép buộc' là một dấu hiệu cho thấy có một phương pháp S4 cho as(temp, ..."). Các phương pháp thực tế là

> x = methods(class=class(temp)) 
There were 18 warnings (use warnings() to see them) 
> attr(x, "info") 
                visible from  generic isS4 
coerce,oldClass,S3-method       TRUE   coerce TRUE 
coerce,XMLAbstractDocument,XMLAbstractNode-method TRUE XML  coerce TRUE 
coerce,XMLDocument,XMLInternalDocument-method  TRUE XML  coerce TRUE 
coerce,XMLInternalDocument,character-method   TRUE XML  coerce TRUE 
coerce,XMLInternalDocument,XMLHashTree-method  TRUE XML  coerce TRUE 
coerce,XMLInternalDocument,XMLInternalNode-method TRUE XML  coerce TRUE 
coerce,XMLInternalNode,XMLInternalDocument-method TRUE XML  coerce TRUE 
initialize,oldClass-method       TRUE  initialize TRUE 
show,oldClass-method         TRUE    show TRUE 
slotsFromS3,oldClass-method       TRUE  slotsFromS3 TRUE 

Mặt khác có

> methods(class="matrix") 
[1] anyDuplicated as.data.frame as.raster  boxplot  coerce  
[6] determinant duplicated edit   head   initialize 
[11] isSymmetric Math   Math2   Ops   relist  
[16] subset  summary  tail   unique  
see '?methods' for accessing help and source code 

nơi chúng ta thấy phương pháp as.data.frame()as.raster() sẵn cho ép buộc một ma trận.

+0

Cảm ơn bạn. Rất nhiều thứ để tham gia, trong một lần cho tôi. Tôi cần phải nhìn vào các lớp S3 và S4. –

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