RenjinScriptEngineFactory 和 AppEngineContextFactory 的区别

Difference between RenjinScriptEngineFactory and AppEngineContextFactory

我正在玩这个优秀的 renjin 项目,我想知道它们之间有什么区别:

RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine();

ScriptEngine engine = AppEngineContextFactory.createScriptEngine(context);

第一个例子来自eclipse-dynamic-web-project and the second example comes from the appengine-servlet例子。

感谢您的帮助。

这两个接口都是 SessionBuilder class 的包装器,它创建了一个新的 Renjin Session 对象,可以在其中评估代码。

RenjinScriptEngineFactory,它是 Java 脚本 API 的实现,使用原始默认值创建一个新会话:

@Override
public RenjinScriptEngine getScriptEngine() {
   Session session = new SessionBuilder().withDefaultPackages().build()
   return new RenjinScriptEngine(this, session);
}

AppEngineContextFactory 还创建了一个新会话,但使用与 AppEngine 兼容的 Apache VFS FileSystemManager 实例:

public static ScriptEngine createScriptEngine(ServletContext servletContext) {
    Session session = new SessionBuilder()
        .withFileSystemManager(createAppEngineFileSystemManager(servletContext))
        .withDefaultPackages()
        .build();
    RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();

    return factory.getScriptEngine(session);
}

在 AppEngine 环境中,文件系统操作在设计上非常有限,允许 R 脚本甚至 尝试 访问根目录中的文件,如“/home/alex/mydata" 可以关闭您的虚拟机。

对于这种情况,Renjin 通过 Apache Virtual File System library, so that you can control how R scripts see and interact with the file system. AppEngineContextFactory creates a "fake" file system 调解所有 R 文件系统操作,您的 Web 应用程序位于根目录中。

这样,您的脚本仍然可以安全地访问与您的应用程序一起部署的文件,例如:

myModel <- readRDS("/WEB-INF/data/model.rds")
y <- predict(myModel, x)

您当然可以使用 AppEngineContextFactory 作为起点来进一步完善您的 R 脚本的环境 运行。