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()
và as.raster()
sẵn cho ép buộc một ma trận.
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. –