【发布时间】:2019-03-20 19:44:26
【问题描述】:
我有一个奇怪的环境/范围动态,我一直在试图弄清楚,并寻找正确的或推荐的方法来实现这一点。
我在下面为我的问题制作了一个玩具示例,纯粹是为了说明。 (我知道这个特定问题可以更简单地解决,但它说明了我试图实现的动态)。
当前功能代码:
master_function <-
function(x, iter = 100){
x_p1 <- function(){ x <<- x + 1 }
x_m1 <- function(){ x <<- x - 1 }
path <- numeric(iter)
for(i in 1:iter){
next_step <- sample(c('p', 'm'), 1)
if(next_step == 'p'){
x_p1()
} else {
x_m1()
}
path[i] <- x
}
path
}
这段代码的问题(特别是对于一个真正困难的问题)是它使使用 RStudio 调试实用程序调试 x_p1、x_m1 函数内容变得不可能。
希望将代码重组为如下所示:
master_function <-
function(x, iter = 100){
master_env <- environment()
path <- numeric(iter)
for(i in 1:iter){
next_step <- sample(c('p', 'm'), 1)
if(next_step == 'p'){
x_p1(master_env)
} else {
x_m1(master_env)
}
path[i] <- x
}
path
}
x_p1 <- function(env){ assign('x', get('x', envir = env) + 1, envir = env) }
x_m1 <- function(env){ assign('x', get('x', envir = env) - 1, envir = env) }
但这也很丑陋。有没有办法增加搜索路径,例如,使对master_env 的访问更清晰?
编辑:@MrFlick 要求的更多信息
基本上我有很多移动部件的模拟。随着它的进行,不同的事件(被引用的子函数)被触发以修改模拟的状态。这些函数当前为每个函数调用修改许多不同的状态对象。由于这些函数是在主函数调用中创建的,因此我可以利用词法范围和<<- 运算符,但我无法在这些函数中进行调试。
试图弄清楚如何在主模拟之外创建这些功能。如果我理解正确的话,如果我让函数消耗模拟状态并返回修改后的版本,那么内存开销会很大。
【问题讨论】:
-
我无法理解此示例的要求。这似乎不是很有说明性。也许用语言准确地说出您希望完成的事情?您似乎想优化调试,但我不确定在这种情况下这意味着什么。
-
@MrFlick 更详细地编辑了问题
-
我不明白为什么您不只在列表中跟踪所有状态信息,然后将当前状态传递给您的函数,如果需要,它们可以输出更新的状态列表。这将更像 R。只有发生变化的值才会在内存中更新。您是否有一个显示大内存成本的示例?
标签: r environment scoping