R中as.character()和as(,“character”)之间有什么区别

时间:2015-04-10 16:20:22

标签: r

在表面上,他们似乎都在做同样的事情。但似乎后者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>"

1 个答案:

答案 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()可用于强制转换矩阵。