2

我尝试在 JavaFx 中运行我的 R 脚本。我为此目的使用 Renjin,它似乎与我在内部运行的语句一起正常工作。但我想运行一个外部 R 脚本。该项目是使用 Maven 设置的,因此路径应该很简单,因为 R 脚本位于资源文件夹中。该路径在我加载 FXML 文件时有效,所以我很困惑为什么它找不到我的脚本。

这是一个简短的示例:

package survey;

import javax.script.*;
import org.renjin.script.*;
import java.io.FileReader;

public class calcFunction {

  public static void main(String[] args) throws Exception {
    // create a script engine manager:
    RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();
    // create a Renjin engine:
    ScriptEngine engine = factory.getScriptEngine();

    engine.put("x", 4);
    engine.put("y", 5);

    engine.eval(new FileReader("/test.R"));
  }

}

有什么遗漏吗?提前致谢!

编辑1:

使用我的 FXML 文件,它可以与“/”路径一起使用,如下所示:

 root = FXMLLoader.load(getClass().getResource("/moduleDa.fxml"));   

编辑2:

删除他的评论的人提出了这个:

engine.eval(new FileReader(new File(".").getAbsolutePath()+"/test.R"));

如果脚本位于 pom.xml 文件所在的根目录中,则它可以工作。@James_D 使它工作,因此 R 脚本可以位于资源文件夹中 - 非常感谢!

4

1 回答 1

2

如果您的 R 脚本作为应用程序的一部分捆绑在一起,则不能将其视为文件 - 您需要将其视为资源。通常,您会将应用程序部署为 Jar 文件,并且资源将是该 jar 文件中的元素(它们本身不会是文件)。

因此,只需将 R 脚本视为资源并照此加载即可。我不知道 renjin 框架,但我假设ScriptEngine这里是 a javax.script.ScriptEngine,在这种情况下ScriptEngine.eval(...)将 aReader作为参数,所以(如果你的 R 脚本位于类路径的根目录中)你可以这样做

engine.eval(new InputStreamReader(getClass().getResourceAsStream("/test.R")));
于 2017-09-18T13:29:04.837 回答