R''as'函数的类型/来源

Pej*_*ylo 8 generics r object dispatch r-s3

R的S3 OO系统以泛型函数为中心,这些函数根据调用泛型函数的对象类调用方法.关键是泛型函数调用适当的方法,而不是在类中定义方法的其他OO编程语言.

例如,该mean函数是通用函数.

isGeneric("mean")
methods(mean)
Run Code Online (Sandbox Code Playgroud)

这将打印

TRUE
[1] mean,ANY-method          mean.Date                mean.default             mean.difftime           
[5] mean.IDate*              mean,Matrix-method       mean.POSIXct             mean.POSIXlt            
[9] mean,sparseMatrix-method mean,sparseVector-method
see '?methods' for accessing help and source code
Run Code Online (Sandbox Code Playgroud)

我正在探索R并发现了这个as功能.我很困惑R这个函数不是通用的,但它仍然有方法.

isGeneric("as")
methods(as)

TRUE
  [1] as.AAbin                                  as.AAbin.character                       
  [3] as.alignment                              as.allPerms                              
  [5] as.array                                  as.array.default                         
  [7] as.binary                                 as.bitsplits                             
  [9] as.bitsplits.prop.part                    as.call
  ...                                  
Run Code Online (Sandbox Code Playgroud)

最后有一个警告说这as不是通用的.

 Warning message:
 In .S3methods(generic.function, class, parent.frame()) :
 function 'as' appears not to be S3 generic; found functions that look like S3 methods
Run Code Online (Sandbox Code Playgroud)

有人能解释我是什么as功能,以及如何连接as.list,as.data.frame等等?R说这as.list是一个通用的(我很想对R中的不一致感到有点生气,因为我希望as.list它是泛型函数中list对象的一种方法as).请帮忙.

42-*_*42- 11

as不是S3通用,但请注意你是TRUE.(我得到了一个假.)这意味着你已经加载了一个定义as为S4泛型的包.S3-generics通过使用*.default函数和UseMethod函数的类调度工作.我得到的FALSE意味着没有为通用定义的方法as可以查找.缺少泛型的一个可论证的原因as是,仅使用一个数据对象调用此类函数不会指定"强制目标".这意味着目标需要内置到函数名称中.

声明as为Generic之后(请注意大写,这暗示这适用于S4功能:

setGeneric("as")  # note that I didn't really even need to define any methods

get('as')
#--- output----
standardGeneric for "as" defined from package "methods"

function (object, Class, strict = TRUE, ext = possibleExtends(thisClass, 
    Class)) 
standardGeneric("as")
<environment: 0x7fb1ba501740>
Methods may be defined for arguments: object, Class, strict, ext
Use  showMethods("as")  for currently available ones.
Run Code Online (Sandbox Code Playgroud)

如果我重新启动R(并且不加载任何调用setGeneric为'as'的库),我得到:

get('as')
#--- output ---
function (object, Class, strict = TRUE, ext = possibleExtends(thisClass, 
    Class)) 
{
    if (.identC(Class, "double")) 
        Class <- "numeric"
    thisClass <- .class1(object)
    if (.identC(thisClass, Class) || .identC(Class, "ANY")) 
        return(object)
    where <- .classEnv(thisClass, mustFind = FALSE)
    coerceFun <- getGeneric("coerce", where = where)
    coerceMethods <- .getMethodsTable(coerceFun, environment(coerceFun), 
        inherited = TRUE)
    asMethod <- .quickCoerceSelect(thisClass, Class, coerceFun, 
        coerceMethods, where)
    .... trimmed the rest of the code
Run Code Online (Sandbox Code Playgroud)

但是当你讨论语言设计时,你会问"为什么",这总是一个危险的问题.我翻阅了S中统计模型的最后一章,这是大多数适用于S3调度的帮助页面的引用参考,并没有找到强制或as函数的讨论.有一个隐含的"S3 generic"定义要求使用UseMethod但不提及为什么as被排除在该策略之外.我想到了两种可能性:它是在强制应用中防止任何类型的继承模糊,或者它是一种效率决策.

我应该补充说有一个S4 setAs功能,你可以找到所有的S4-coercion功能showMethods("coerce").

  • 我提出了我的理论,但我认为这实际上是一个"提问作者"的问题,而且很少有人经常这样做.也许Rhelp查询会提供更多信息. (3认同)