R 的 'as' 函数的 type/origin
type/origin of R's 'as' function
R 的 S3 OO 系统以泛型函数为中心,这些函数根据调用泛型函数的对象的 class 来调用方法。关键在于通用函数调用适当的方法,这与在 class.
中定义方法的其他 OO 编程语言相反。
例如,mean
函数是一个泛型函数。
isGeneric("mean")
methods(mean)
这将打印
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
我稍微探索了一下 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
...
最后有一条警告说 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
谁能解释一下 as
函数是什么以及如何连接到 as.list
、as.data.frame
等? R 说 as.list
是一个通用的(我很想对 R 中的不一致感到有点生气,因为我希望 as.list
是一个 list
对象的方法as
通用函数)。请帮助。
as
不是 S3 泛型,但请注意您得到的是 TRUE。 (我得到了一个 FALSE。)这意味着您已经加载了一个将 as
定义为 S4-generic 的包。 S3-generics 通过使用 *.default
函数和 UseMethod
函数的 class 调度工作。我得到的 FALSE 意味着没有为通用 as
定义的方法可以被查找。缺少通用 as
的一个有争议的原因是,仅使用一个数据对象调用这样的函数不会指定 "coercion destination"。这意味着目标需要内置到函数名称中。
在声明 as
为通用之后(注意大写,这暗示这适用于 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.
如果我重新启动 R(并且不加载任何为 'as' 调用 setGeneric 的库)我得到:
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
但是你问 "why",当然,在讨论语言设计时总是一个危险的问题。我翻阅了 S 中统计模型的最后一章,这是大多数适用于 S3 调度的帮助页面的引用参考,但没有找到关于强制转换或 as
函数的讨论。 "S3 generic" 的隐含定义要求使用 UseMethod
但没有提及为什么 as
被排除在该策略之外。我想到了两种可能性:它是为了防止在强制转换的应用中出现任何类型的继承歧义,或者它是一种效率决定。
我应该补充一点,有一个 S4 setAs
函数,您可以找到所有带有 showMethods("coerce")
的 S4 强制函数。
R 的 S3 OO 系统以泛型函数为中心,这些函数根据调用泛型函数的对象的 class 来调用方法。关键在于通用函数调用适当的方法,这与在 class.
中定义方法的其他 OO 编程语言相反。例如,mean
函数是一个泛型函数。
isGeneric("mean")
methods(mean)
这将打印
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
我稍微探索了一下 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
...
最后有一条警告说 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
谁能解释一下 as
函数是什么以及如何连接到 as.list
、as.data.frame
等? R 说 as.list
是一个通用的(我很想对 R 中的不一致感到有点生气,因为我希望 as.list
是一个 list
对象的方法as
通用函数)。请帮助。
as
不是 S3 泛型,但请注意您得到的是 TRUE。 (我得到了一个 FALSE。)这意味着您已经加载了一个将 as
定义为 S4-generic 的包。 S3-generics 通过使用 *.default
函数和 UseMethod
函数的 class 调度工作。我得到的 FALSE 意味着没有为通用 as
定义的方法可以被查找。缺少通用 as
的一个有争议的原因是,仅使用一个数据对象调用这样的函数不会指定 "coercion destination"。这意味着目标需要内置到函数名称中。
在声明 as
为通用之后(注意大写,这暗示这适用于 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.
如果我重新启动 R(并且不加载任何为 'as' 调用 setGeneric 的库)我得到:
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
但是你问 "why",当然,在讨论语言设计时总是一个危险的问题。我翻阅了 S 中统计模型的最后一章,这是大多数适用于 S3 调度的帮助页面的引用参考,但没有找到关于强制转换或 as
函数的讨论。 "S3 generic" 的隐含定义要求使用 UseMethod
但没有提及为什么 as
被排除在该策略之外。我想到了两种可能性:它是为了防止在强制转换的应用中出现任何类型的继承歧义,或者它是一种效率决定。
我应该补充一点,有一个 S4 setAs
函数,您可以找到所有带有 showMethods("coerce")
的 S4 强制函数。