Ренджин: Как очистить контекст? - PullRequest
0 голосов
/ 25 сентября 2019

Как я понимаю, контекст Renjin содержит переменные со своими значениями.

Предположим, я вызывал это один раз:

engine.eval("df <- data.frame(x=1:10, y=(1:10)+rnorm(n=10))");
engine.eval("print(df)");
engine.eval("print(lm(y ~ x, df))");

Как очистить контекст, чтобы при вызове engine.eval("print(df)"); возникло исключениео неизвестной переменной после очистки контекста?

Я хочу оценить различные вычисления без смешивания контекста и пересоздания движка.

1 Ответ

0 голосов
/ 26 сентября 2019

Вы имеете в виду "контекст", я думаю, что глобальная среда R.Каждый экземпляр RenjinScriptEngine имеет свою собственную независимую глобальную среду.

Вы можете проверять, изменять и очищать значения, заданные в глобальной среде, используя базовые функции R, например:

engine.eval("print(ls())");  // print all symbols in the global environment
engine.eval("rm(ls())");     // remove all symbols in the global environment 
                             // (that don't start with a "." )

engine.eval("rm(ls(all.names=TRUE))"); // remove everything

Вы также можете использовать API javax.script для выполнениято же самое:

engine.getBindings(ScriptContext.ENGINE).clear();

В зависимости от вашего варианта использования может быть достаточно очистки глобальной среды, но имейте в виду, что RenjinScriptEngine содержит дополнительное состояние.

Если вы загружаете пакеты и / или их пространства имен через library(), require() или mypackage::fun(), это повлияет на внутреннее состояние RenjinScriptEngine.

Другие вещи, которые влияют на сессию-уровень (RenjinScriptEngine) состояние:

  • Глобальные параметры, установленные с помощью options()
  • Состояние генератора случайных чисел и начальное число
  • Внутреннее состояние сторонних пакетов
  • Открытие файлов и других подключений
...