这两个接口都是 SessionBuilder 类的包装器,它创建了一个新的 Renjin Session 对象,可以在其中评估代码。
RenjinScriptEngineFactory 是 Java Scripting API 的实现,它使用 vanilla 默认值创建一个新的 Session:
@Override
public RenjinScriptEngine getScriptEngine() {
Session session = new SessionBuilder().withDefaultPackages().build()
return new RenjinScriptEngine(this, session);
}
AppEngineContextFactory还创建一个新的 Session,但使用与 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”可以让你的 VM 关闭。
对于这种场景,Renjin 通过Apache Virtual File System库协调所有 R 文件系统操作,以便您可以控制 R 脚本如何查看文件系统并与文件系统交互。AppEngineContextFactory
创建一个“假”文件系统,您的 Web 应用程序位于其中的根目录。
这样,您的脚本仍然可以安全地访问随应用程序部署的文件,例如:
myModel <- readRDS("/WEB-INF/data/model.rds")
y <- predict(myModel, x)
您当然可以使用AppEngineContextFactory作为起点来进一步优化您的 R 脚本运行的环境。