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