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

dim*_*_ps 8 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'
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)

Mar*_*gan 9

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()用于强迫矩阵可用.