У меня странная динамика среды/области действия, которую я пытаюсь выяснить и ищу правильный или рекомендуемый метод для достижения этой цели.
Я сделал игрушечный пример моей проблемы ниже исключительно для иллюстрации. (Я знаю, что эту конкретную проблему можно решить гораздо проще, но она иллюстрирует динамику, которую я пытаюсь реализовать).
Текущий рабочий код:
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
}
Проблема с этим кодом (особенно для действительно сложной проблемы) заключается в том, что он делает невозможной отладку содержимого функций x_p1
, x_m1
с помощью утилиты отладки RStudio.
Надеясь реструктурировать код, чтобы он выглядел примерно так:
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 По сути, у меня есть симуляция с большим количеством движущихся частей. По мере его развития запускаются различные события (на которые ссылаются подфункции), изменяющие состояние симуляции. Эти функции в настоящее время изменяют множество различных объектов состояния для каждого вызова функции. Поскольку функции создаются в вызове основной функции, я могу воспользоваться преимуществами лексической области видимости и оператора <<-
, но теряю возможность отладки внутри этих функций.
Попытка выяснить, как создать эти функции вне основной симуляции. Если я правильно понимаю, если я сделаю функции такими, что они потребляют состояние симуляции и возвращают модифицированную версию, это приводит к большим затратам памяти.