在表面上,他们似乎都在做同样的事情.但似乎后者as(,"character")更强大.
举个例子考虑以下内容:
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'
Run Code Online (Sandbox Code Playgroud)
而as(temp, "character")给出
#[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>"
Run Code Online (Sandbox Code Playgroud)
as.character()是一个S3泛型,而是as()S4泛型和方法的方法包中定义的函数.
S3类的作者没有理由编写S4强制方法,因此对于intance
> as.data.frame(matrix(integer()))
[1] V1
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)
但
> as(matrix(integer()), "data.frame")
Error in as(matrix(), "data.frame") :
no method or default for coercing "matrix" to "data.frame"
Run Code Online (Sandbox Code Playgroud)
对于S4类,一个(即包开发者)可以(并且确实应该)编写用于强制特定类的S3和S4方法; 一个共同的范例是
as.character.MyClass <- function(x, ...) {}
setAs("MyClass", "character",
function(from) as.character.MyClass(from))
Run Code Online (Sandbox Code Playgroud)
在您的示例中,作者(XML)提供了一个没有S3等效的setAs函数,因此您在使用时会得到特殊处理as(),但默认(即错误)as.character().
关于哪个"更强大"没有一般规则; 即使在基础R和方法包中找到示例也不足为奇,其中as.X和(,"X")表现不同,甚至以逻辑上不一致的方式.
在R(3.2.0)的下一个版本中,您可以说
> 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
Run Code Online (Sandbox Code Playgroud)
其中'coerce'表示存在S4方法as(temp, ...").实际的方法是
> 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
Run Code Online (Sandbox Code Playgroud)
另一方面有
> 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
Run Code Online (Sandbox Code Playgroud)
在这里我们看到的方法as.data.frame()和as.raster()用于强迫矩阵可用.