我在试着理解NextMethod()generic论点的目的是什么.

例如

# example data
x <- as.Date(c("2022-01-01", "2023-01-01", "1900-01-01", "2024-01-01")) 

# gives cumulative maximum as expected
cummax.Date <- function(x, ...) .Date(NextMethod(), cl = oldClass(x))
cummax(x)
#> [1] "2022-01-01" "2023-01-01" "2023-01-01" "2024-01-01"

# gives cumulative minimum as expected
cummin.Date <- function(x, ...) .Date(NextMethod(), cl = oldClass(x))
cummin(x)
#> [1] "2022-01-01" "2022-01-01" "1900-01-01" "1900-01-01"

最佳实践

Quite often、泛型被显式调用.

cummin.Date <- function(x, ...) .Date(NextMethod(generic = "cummin"), cl = oldClass(x))
cummin(x)
#> [1] "2022-01-01" "2022-01-01" "1900-01-01" "1900-01-01"

糟糕的做法--没有区别

但是,显式调用泛型不会影响结果,无论它是否存在.

# still returns the cumulative minimum
cummin.Date <- function(x, ...) .Date(NextMethod(generic = "cummax"), cl = oldClass(x))
cummin(x)
#> [1] "2022-01-01" "2022-01-01" "1900-01-01" "1900-01-01"

# still returns the cumulative minimum
cummin.Date <- function(x, ...) .Date(NextMethod(generic = "foobar"), cl = oldClass(x))
cummin(x)
#> [1] "2022-01-01" "2022-01-01" "1900-01-01" "1900-01-01"

推荐答案

NextMethod只有在方法的调用环境中没有找到符号.Generic时才使用参数generic. 这种情况只发生在非典型用法中:

> .S3method("mean", "a", function(x, ...) { rm(.Generic); NextMethod() })
> mean(structure(1:6, class = "a"))
Error in NextMethod() : generic function not specified
> .S3method("mean", "b", function(x, ...) { rm(.Generic); NextMethod("diff") })
> mean(structure(1:6, class = "b"))
[1] 1 1 1 1 1
attr(,"class")
[1] "b"
> .S3method("mean", "c", function(x, ...) { .Generic <- "diff"; NextMethod() })
> mean(structure(1:6, class = "c"))
[1] 1 1 1 1 1
attr(,"class")
[1] "c"

它是未记录的(我认为),但在内部do_nextmethodsources中可见,它使用readS3VarsFromFrame(定义elsewhere)来定位.Generic.

我不认为任何人会建议将.Generic赋值给.Generic,移除.Generic,或者在没有.Generic的上下文中调用NextMethod.事实上,我认为help("NextMethod").Class节中的建议适用于这里:

请注意,.Class是在调用泛型时设置的,如果调度参数的类在方法中更改,则设置不变.可以通过操作.Class来更改NextMethod将调度的方法,但"除非您彻底了解继承机制,否则不建议这样做"(Chambers&Amp;Hastie,1992,p.469).

R相关问答推荐

R:如何自动化变量创建过程,其中我需要基于ifelse()为现有变量的每个级别创建一个单独的变量

使用rlang s arg_match判断函数输入列表

寻找图片边缘

根据选中三个复选框中的一个或两个来调整绘图

如何在R中添加截止点到ROC曲线图?

如何在geom_col中反转条

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

条形图和在Ploly中悬停的问题

如何通过匹配R中所有可能的组合来从宽到长旋转多个列?

在R函数中使用加号

`夹心::vcovCL`不等于`AER::tobit`标准错误

列名具有特殊字符时的循环回归

我如何go 掉盒子图底部的数字?

如何使用同比折线图中的个别日

如果条件匹配,则使用Mariate粘贴列名

按组和连续id计算日期差

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

如何使用grepl()在数据帧列表中 Select 特定字符串?

R:使用ApexCharge更改标签在饼图中的位置

将美学添加到ggploy中的文本标签