dump () для сред (рекурсивно) - PullRequest
1 голос
/ 29 апреля 2020

Я хочу dump() некоторых объектов, но, к сожалению, dump() недостаточно надежен:

x = 5
# ok
dump('x', stdout())
# x <-
# 5

# bad / incomplete
dump('.GlobalEnv', stdout())
# .GlobalEnv <-

Ошибка в дампе (". GlobalEnv", stdout ()): ( преобразуется из предупреждения) deparse может быть неполным

В простом случае это можно преодолеть с помощью самого dump:

# option 1; can be reversed by wrapping in
#   list2env(within(list(), { . }))
e = new.env()
e$x = 5
dump(ls(e), stdout(), envir = e)
# x <-
# 5

# option 2; can be reversed by wrapping in 
#   list2env( . )
e = as.list(e)
dump('e', stdout())

Однако, это разваливается во вложенном сценарии ios:

l = list(e = new.env())
l$e$x = 5
# same error as before
dump('l', stdout())

В этом случае желаемым результатом будет все, что может воспроизвести l с source, например,

l <-
list(e = list2env(within(list(), {
  x <- 
  5
})))

Это рекурсивная проблема, но я немного застрял в том, как точно go об этом точно сказать.

Существует также проблема, связанная с тем, что среды могут быть действительно рекурсивными (среда e содержит e сама); Я бы проигнорировал это для целей здесь.

1 Ответ

1 голос
/ 29 апреля 2020

На данный момент мне удалось решить проблему с помощью save() для вывода объектов вместо dput() / dump(). Поскольку save() не имеет опции append, я сделал следующий обходной путь:

TARGET = tempfile()

repro_env = new.env()
if (file.exists(TARGET)) {
  load(TARGET, envir = repro_env)
  repro_env$obj_count = repro_env$obj_count + 1L
} else repro_env$obj_count = 1L
repro_env[[sprintf('object_%d', repro_env$obj_count)]] = object
save(list = ls(repro_env), envir = repro_env, file = TARGET)

Затем, когда мне нужно, я могу load(TARGET) вернуть все объекты обратно в любой другой R сессия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...