r - R `+` 运算符如何知道根据类的不同表现不同?

标签 r lubridate

这是 lubridate 包中的一个方法。

> getMethod("month<-")
Method Definition (Class "derivedDefaultMethod"):

  function (x, value)
  {
    if (!is.numeric(value)) {
      value <- pmatch(tolower(value), c("january", "february",
                                        "march", "june", "july", "august", "september", "october",
                                        "november", "december"))
    }
    x <- x + months(value - month(x))
  }

我的问题是带有 + 运算符的最后一行。该运算符的行为因 x 的类而异。 R 如何知道要这样做?如何查看 + 的源代码?

> library(lubridate)
> 
> customFUN <- function (x, value){
+   x <- x + months(value - month(x))
+   return(x)
+ }
> 
> 
> init_datePOSIX <- as.POSIXct("2017-11-01")
> init_dateDate <- as.Date("2017-11-01")
> 
> customFUN(init_datePOSIX, 12)
[1] "2017-11-01 PDT"
> customFUN(init_dateDate, 12)
[1] "2017-12-01"

我的 session 信息:

> sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] lubridate_1.7.1

loaded via a namespace (and not attached):
[1] magrittr_1.5  tools_3.3.3   yaml_2.2.0    Rcpp_1.0.0    stringi_1.3.2 stringr_1.3.1

最佳答案

+运算符实际上就像任何其他函数一样,并且可以这样对待。

您可以查看 + 的源代码通过输入:

`+`

此外,您还可以看到+的各种方法。通过输入:

methods(`+`)

当调用函数时,会检查对象的类以确定应调用哪个方法。当存在多个类时,将从类中获取第一个匹配的方法。

因此,您可以为 + 定义自己的方法

`+.custom` <- function(e1, e2) {
  paste0(e1, e2)
}

x <- 1
class(x) <- c("custom", "numeric")

x + x

在这里,我们重写了 x 的类包含一个附加"custom" ,您可以看到该行为默认为新定义的 +.custom .

但是,对于尚未定义的其他方法,该值仍将正常工作(数字),请尝试以下代码:

x / 10 * 500

附加阅读: https://stat.ethz.ch/R-manual/R-patched/library/base/html/UseMethod.html

关于r - R `+` 运算符如何知道根据类的不同表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57264133/

相关文章:

php - 如何将这个 "R"公式翻译成MySQL/PHP?

从 R 中的两个数据框中随机选择相同的 X 行数

regex - 从字符串和文本数据中提取年份

r - 如何在 R 中跨非连续行删除重复的日期序列?

r - 在 `df1` 中创建一个变量,具体取决于 `df1` (`df1$var1` 的一个变量,以及 `df2` 的一个可根据 `df1$var1` 更改的变量

r - 使用 roxygen2 自动记录 S4 泛型的所有方法

css - 在 reveal.js R Markdown 演示文稿中更改标题幻灯片颜色

R:如何从日期时间添加卷

r - 有什么方法可以用较低时间尺度的信号填充(填充)每月动物园对象?

r - 计算一系列字符串的平均值,然后删除 R 中大于平均值 2SD 的任何内容