创建自定义类的对象并为其分配方法

时间:2019-04-01 09:25:31

标签: r oop

我正在尝试创建一个类“ weeknumber”的对象,该对象的格式应为:“ 2019-W05”

此外,我需要能够将此对象与+-运算符一起使用。类似变量“ Date”在基数R中起作用。例如:

  • “ 2019-W05” +1 =“ 2019-W06”
  • “ 2019-W01”-1 =“ 2018-W52”
  • “ 2019-W03”-“ 2019-W01” = 2

我设法部分实现了我的目标。这是我到目前为止所得到的:

weeknum <- function(date){

    # Function that creates weeknumber object from a date

    weeknumber <- paste(isoyear(date), formatC(isoweek(date), width = 2, format = "d", flag = "0"), sep = "-W")
    class(weeknumber) <- c("weeknumber", class(weeknumber))
    weeknumber
}

week2date <- function(weeknumber, weekday = 4) {

    # Wrapper around ISOweek2date function from the 'ISOweek' package

    ISOweek2date(paste(weeknumber, weekday, sep = "-"))
}

"+.weeknumber" <- function(x, ...) {

    # Creating a method for addition

    x <- week2date(x) + sum(...)*7

    weeknum(x)
}

"-.weeknumber" <- function(x, ...) {

    # Creating a method for subtraction

    x <- week2date(x) - sum(...)*7

    weeknum(x)
}

有效方法:

> x <- weeknum("2019-01-01")

> x
[1] "2019-W01"
attr(,"class")
[1] "weeknumber" "character" 

> x + 1
[1] "2019-W02"
attr(,"class")
[1] "weeknumber" "character" 

> x - 1
[1] "2018-W52"
attr(,"class")
[1] "weeknumber" "character" 

按预期工作!唯一令人讨厌的是,还调用了变量 打印出属性。有什么办法可以将它们隐藏在默认的打印输出中?

什么不起作用:

> 1 + x
 Error: all(is.na(weekdate) | stringr::str_detect(weekdate, kPattern)) is not TRUE 

> y <- weeknum("2019-03-01")
> y - x
 Error in as.POSIXlt.default(x) : 
  do not know how to convert 'x' to class “POSIXlt” 

任何帮助表示赞赏!

编辑:

找出解决方案,如何使1 + x(其中x是周数)起作用。不太优雅,但是能胜任工作。

"+.weeknumber" <- function(...) {

    # Creating a method for addition

    vector <- c(...)

    week_index   <- which(unlist(lapply(list(...), function(x) class(x)[1]))=="weeknumber")
    week         <- vector[week_index]
    other_values <- sum(as.numeric(c(...)[-week_index]))

    x <- week2date(week) + other_values*7

    weeknum(x)

}

> x <- weeknum("2019-01-01")
> x
[1] "2019-W01"

> 5 + x + 1 + 2 - 1
[1] "2019-W08"


1 个答案:

答案 0 :(得分:0)

第一部分:为您的课程定义自定义print方法:

print.weeknumber <- function(x,...) 
  {
  attributes(x) <- NULL
  print(x)
  }