首页 > 解决方案 > 为 Rstudio 中的方法编写函数

问题描述

我想请你帮忙。事实上,我目前正在尝试创建一个包来模拟滚动对象并创建函数来这样做。更准确地说,我创建了 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]

我得到第 10 卷。

此外,我还想要一个可以让我替换给定卷的功能。说“<-”这样

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

用头替换第 10 卷。

最后,一种能够得到的加法方法

        roll(die, times= 300) 

例如通过做

          roll(die, times = 100) + 200

非常感谢你!!

标签: rfunctionpackageextension-methods

解决方案


由于您已经使用了一些 S3 方法调度class(obj) <- "class",您应该能够:

`[.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 

推荐阅读