繁体   English   中英

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

[英]What is the difference between as.character() and as( ,“character”) in 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>"

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()时默认(即错误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

其中'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

另一方面有

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM