gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:15:34 25 4
gpt4 key购买 nike

R 的 S3 OO 系统以泛型函数为中心,这些函数根据调用泛型函数的对象的类来调用方法。关键在于泛型函数调用适当的方法,而不是其他 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.listas.data.frame 等吗? R 说 as.list 是一个泛型(我很想对 R 中的不一致感到有点生气,因为我希望 as.list 是一个方法对于来自 as 泛型函数的 list 对象)。请帮忙。

最佳答案

as不是 S3 泛型,但请注意您得到的是 TRUE。 (我得到一个 FALSE。)这意味着您已经加载了一个定义 as 的包。作为 S4 通用。 S3 泛型通过使用 *.default 的类调度来工作函数和 UseMethod -功能。我得到的 FALSE 意味着没有为泛型 as 定义方法那会被查到。缺乏通用的一个有争议的原因as问题在于,仅使用一个数据对象调用这样的函数不会指定“强制目标”。这意味着目的地需要内置到函数名称中。

声明 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

但是你问“为什么”,当然,在讨论语言设计时这始终是一个危险的问题。我翻阅了《S 中统计模型》的最后一章,这是大多数适用于 S3 调度的帮助页面引用的引用文献,但没有发现任何关于强制或 as 的讨论。功能。 “S3 generic”有一个隐式定义,需要使用 UseMethod但没有提及原因 as被排除在该策略之外。我想到两种可能性:它是为了防止在强制转换的应用中出现任何类型的继承歧义,或者它是一个效率决定。

我可能应该补充一点,有一个 S4 setAs -function 并且您可以使用 showMethods("coerce") 找到所有 S4 强制函数.

关于r - R 'as' 函数的类型/来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48252241/

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