为Rstudio中的方法编写函数

时间:2018-11-17 00:16:59

标签: r function package extension-methods

我想寻求您的帮助。实际上,我目前正在尝试创建一个包来模拟滚动对象并创建函数来这样做。更准确地说,我创建了roll函数,该函数接受设备的参数以及设备的滚动次数。

roll <- function(device=device(), times=1 ) {
  if (class(device) != "device") {
    stop("the object must be of class device")
  }
  check_times(x=times)
  rolls <-  sample(device$sides, size=times,
                   replace= TRUE, prob= device$prob)
  obj <- list(rolls= rolls, sides = device$sides,
              prob= device$prob, total= times)
  class(obj) <- "rolls"
  print.rolls(obj)
}

我实际上想创建一个提取函数,如果可以的话

             object <- roll(die, times = 100)
             oject[10]

我得到第十卷。

此外,我还希望有一个函数可以替换给定的纸卷。说“ <-”,使

        object <- roll(two_side_die, times = 100)
        object[10] <- "head"

逐个替换第10卷。

最后,是一种能够获得

的附加方法
        roll(die, times= 300) 

例如

          roll(die, times = 100) + 200

非常感谢您!

1 个答案:

答案 0 :(得分:3)

由于您已经在class(obj) <- "class"中使用了一些S3方法分派,因此您应该能够做到:

`[.rolls` <- function(obj, ind) obj$rolls[ind]
`[<-.rolls` <- function(obj, ind, value) { obj[["rolls"]][ind] <- value; obj; }

一些虚假数据:

foo <- list(rolls=10L+1:5, sides=6, probs = 1/6)
class(foo) <- "rolls"
foo[3]
# [1] 13
foo[3] <- 99L
foo
# $rolls
# [1] 11 12 99 14 15
# $sides
# [1] 6
# $probs
# [1] 0.1666667
# attr(,"class")
# [1] "rolls"

您可以进行漂亮的打印,尽管它只有交互式用途:

print.rolls <- function(x, ...) {
  cat("<Rolls>\n")
  cat("  len: ", length(x[["rolls"]]), "\n")
  cat("  other properties: ", paste(sort(setdiff(names(x), "rolls")), collapse = ", "), "\n")
}
foo
# <Rolls>
#   len:  5 
#   other properties:  probs, sides