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()
для понуждения матрицы.
Спасибо. Много, чтобы забрать, в один раз для меня. Мне нужно изучить классы S3 и S4. –