我尝试在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"));
}
}
缺少什么?提前谢谢!
EDIT1:
使用我的FXML文件,它可以使用“/”路径,如下所示:
root = FXMLLoader.load(getClass().getResource("/moduleDa.fxml"));
EDIT2:
删除评论的人建议:
engine.eval(new FileReader(new File(".").getAbsolutePath()+"/test.R"));
如果脚本位于pom.xml文件所在的根目录中,则它可以正常工作。 @James_D使它工作,所以R脚本可以位于资源文件夹中 - 非常感谢!
答案 0 :(得分:1)
如果您的R脚本作为应用程序的一部分捆绑在一起,则无法将其视为文件 - 您需要将其视为资源。通常,您将应用程序部署为Jar文件,资源将是该jar文件中的元素(它们本身不会成为文件)。
所以只需将R脚本视为资源并加载它即可。我不知道renjin框架,但我认为ScriptEngine
这里是javax.script.ScriptEngine
,在这种情况下ScriptEngine.eval(...)
将Reader
作为参数,等等(如果您的R脚本位于类路径的根目录中,则可以执行
engine.eval(new InputStreamReader(getClass().getResourceAsStream("/test.R")));