r - r、缓存、安全和*应用
问题描述
我想在不改变结果的情况下改进我的 R 包,缓存子函数(仅优化)。
我已经看到缓存包像memoise一样存在。似乎也可以简单地在包内存储一些带有闭包的调用,最简单的例子是
multiplyby3_generator <- function() {
save <- c(0,0)
function(value) {
if (value != save[1]) {
save <<- c(value,3*value)
warning("Recalculation !")
}
return(save[2])
}
}
multiplyby3 <- multiplyby3_generator()
multiplyby3(3)
# [1] 9
# Warning message:
# In multiplyby3(3) : Recalculation !
multiplyby3(3)
# [1] 9
但是,如何让在包中使用这种东西既安全又有用呢?
据我所理解 :
- 如果我做了类似我的例子的事情,我将不得不禁止对母函数进行各种并行计算。否则会有在和
save
之间更改引用的风险。您可以禁止并行化吗?是否足以使其安全?还是另一种使它安全的方法?if (value != save[1])
return(save[2])
- 要使缓存有用,必须知道 *apply 的行为方式。该代码
invisible(lapply(1:100,function(i) print(i)))
倾向于表明 lapply 的评估顺序是列表的顺序。总是这样吗?
谢谢
解决方案
推荐阅读
- ios - Obj-c - 使用更新的 NSMutableArray 重新加载 tableView
- regex - 即使测试中的 URL 模式匹配,通过 IIS 重写模块重定向书签 URL 也无法正常工作
- sql-server - 如何使用 SSIS 从 Excel 文件中获取信息
- python - 为什么我的 Python 代码两次将子元素插入 XML 文件?
- c - 为什么我使用 DDD 时没有出现使断点挂起的选项?
- javascript - D3 选择多个标签-提取值
- php - Codeigniter - 控制器无法发送数据以查看
- ios - 自定义 TableViewCells 不显示
- stanford-nlp - 在命令行中使用 Stanford nndep Parser 期间,sentenceDelimiter 选项不起作用
- python - 为什么执行此 python 代码时我得到 0?