r - 为 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
非常感谢你!!
解决方案
由于您已经使用了一些 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
推荐阅读
- vue.js - 将“proposal-object-rest-spread”插件添加到 babel.config.js 以修复 Microsoft Edge 错误 SCRIPT1028
- git - 如何在一个 github 仓库下添加多个项目文件夹?
- android - 带有 Firebase 的 Android 应用程序在启动时崩溃
- sql-server - 如何跟踪我的员工事实表的更新?
- html - 为什么chrome总是在html文件的body上面加一个div?
- android - 使用 Volley 解析获取 JsonObject
- wordpress - 将(一些)请求从 WordPress 目录路由到 Codeigniter
- c# - 在随机生成的数组中,最小数始终为 0
- nginx - 将子域重定向到端口;不工作
- exception - 按下后退按钮会引发巨大的异常