gpt4 book ai didi

r - R 中的 as.character() 和 as( ,"character") 有什么区别

转载 作者:行者123 更新时间:2023-12-04 07:21:09 34 4
gpt4 key购买 nike

从表面上看,他们似乎都在做同样的事情。但似乎是后者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强制方法,所以举例

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

没有关于哪个“更强大”的一般规则;即使在基本 R 和方法包中找到示例也毫不奇怪,其中 as.X 和 as(, "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

其中“强制”表示 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()可用于强制矩阵。

关于r - R 中的 as.character() 和 as( ,"character") 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29566200/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com