Блокировка среды, но не .Random.seed - PullRequest
0 голосов
/ 21 февраля 2019

Можно ли заблокировать глобальную среду и разрешить установку или удаление .Random.seed?Поведение по умолчанию lockEnvironment() слишком агрессивно для моего варианта использования.

lockEnvironment(globalenv())
rnorm(10)
#> Error in rnorm(10) : cannot add bindings to a locked environment
rm(.Random.seed)
#> Error in rm(.Random.seed) : 
#>   cannot remove bindings from a locked environment

Фон

drake версия 7.0.0 будет иметь новую защиту длязащитить воспроизводимость.

plan <- drake_plan(
  x = {
    data(mtcars)
    mtcars$mpg
  },
  y = mean(x)
)

plan
#> # A tibble: 2 x 2
#>   target command                            
#>   <chr>  <expr>                             
#> 1 x      {     data(mtcars)     mtcars$mpg }
#> 2 y      mean(x)

make(plan)
#> target x
#> fail x
#> Error: Target `x` failed. Call `diagnose(x)` for details. Error message:
#>   cannot add bindings to a locked environment. 
#> One of your targets tried to modify your environment,
#> which could invalidate other targets
#> and undermine reproducibility (example: 
#> https://github.com/ropensci/drake/issues/664#issuecomment-453163562).
#> Beware <<-, ->>, attach(), data(), and side effects in general.
#> Use make(lock_envir = FALSE) to avoid this error (not recommended).

Ошибка возникает из-за вызова data(mtcars).Сам акт построения x изменил бы зависимости x.Без ограждений рабочий процесс делает себя недействительным.

make(plan, lock_envir = FALSE)
#> target x
#> target y

make(plan, lock_envir = FALSE)
#> target x

Но с поручнями мы сталкиваемся с крайними случаями, такими как https://github.com/ropensci/drake/issues/749 и https://github.com/ropensci/drake/issues/675#issuecomment-458222414.

...