2015-04-10 2 views
8

На поверхности они оба, похоже, делают то же самое. Но похоже, что последний as(,"character") более мощный.В чем разница между as.character() и as (, "character") в R

В качестве примера рассмотрим следующее:

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>" 

ответ

9

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) предоставил Sētas функцию без эквивалента S3, так что вы получите специальное лечение с использованием 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 

где «принуждать» является показателем того, что существует метод 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() для понуждения матрицы.

+0

Спасибо. Много, чтобы забрать, в один раз для меня. Мне нужно изучить классы S3 и S4. –

Смежные вопросы