我想寻求您的帮助。实际上,我目前正在尝试创建一个包来模拟滚动对象并创建函数来这样做。更准确地说,我创建了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
非常感谢您!
答案 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