0

我正在玩出色的renjin项目,我想知道两者之间有什么区别:

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

ScriptEngine engine = AppEngineContextFactory.createScriptEngine(context);

第一个示例来自eclipse-dynamic-web-project,第二个示例来自appengine-servlet示例。

谢谢你的帮助。

4

1 回答 1

1

这两个接口都是 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 脚本运行的环境。

于 2016-04-11T07:21:27.480 回答