【问题标题】:Load .RData from an R script in Scala using Renjin使用 Renjin 从 Scala 中的 R 脚本加载 .RData
【发布时间】:2016-12-06 23:37:18
【问题描述】:

我有一个 R 脚本 load.R 尝试这样做

load("test.RData")

当我跑步时:

engine.eval(new FileReader("load.R"))

发生异常:

   Exception in thread "main" java.lang.NoClassDefFoundError: org/tukaani/xz/XZInputStream
    at org.renjin.primitives.io.connections.Connections.gzfile(Connections.java:79)
    at org.renjin.primitives.R$primitive$gzfile.doApply(R$primitive$gzfile.java:75)
    at org.renjin.primitives.R$primitive$gzfile.apply(R$primitive$gzfile.java:36)
    at org.renjin.primitives.special.InternalFunction.apply(InternalFunction.java:45)
    at org.renjin.eval.Context.evaluateCall(Context.java:302)
    at org.renjin.eval.Context.evaluate(Context.java:222)
    at org.renjin.eval.Context.evaluate(Context.java:163)
    at org.renjin.sexp.Closure.doApply(Closure.java:83)
    at org.renjin.eval.ClosureDispatcher.apply(ClosureDispatcher.java:73)
    at org.renjin.eval.ClosureDispatcher.applyClosure(ClosureDispatcher.java:58)
    at org.renjin.sexp.Closure.apply(Closure.java:78)
    at org.renjin.eval.Context.evaluateCall(Context.java:302)
    at org.renjin.eval.Context.evaluate(Context.java:222)
    at org.renjin.primitives.special.AssignLeftFunction.assignLeft(AssignLeftFunction.java:57)
    at org.renjin.primitives.special.AssignLeftFunction.apply(AssignLeftFunction.java:41)
    at org.renjin.eval.Context.evaluateCall(Context.java:302)
    at org.renjin.eval.Context.evaluate(Context.java:222)
    at org.renjin.primitives.special.BeginFunction.apply(BeginFunction.java:38)
    at org.renjin.eval.Context.evaluateCall(Context.java:302)
    at org.renjin.eval.Context.evaluate(Context.java:222)
    at org.renjin.primitives.special.IfFunction.apply(IfFunction.java:40)
    at org.renjin.eval.Context.evaluateCall(Context.java:302)
    at org.renjin.eval.Context.evaluate(Context.java:222)
    at org.renjin.primitives.special.BeginFunction.apply(BeginFunction.java:38)
    at org.renjin.eval.Context.evaluateCall(Context.java:302)
    at org.renjin.eval.Context.evaluate(Context.java:222)
    at org.renjin.eval.Context.evaluate(Context.java:163)
    at org.renjin.sexp.Closure.doApply(Closure.java:83)
    at org.renjin.eval.ClosureDispatcher.apply(ClosureDispatcher.java:73)
    at org.renjin.eval.ClosureDispatcher.applyClosure(ClosureDispatcher.java:58)
    at org.renjin.sexp.Closure.apply(Closure.java:78)
    at org.renjin.eval.Context.evaluateCall(Context.java:302)
    at org.renjin.eval.Context.evaluate(Context.java:222)
    at org.renjin.eval.Context.evaluateExpressionVector(Context.java:285)
    at org.renjin.eval.Context.evaluate(Context.java:220)
    at org.renjin.script.RenjinScriptEngine.eval(RenjinScriptEngine.java:145)
    at org.renjin.script.RenjinScriptEngine.eval(RenjinScriptEngine.java:104)
    at com.infosistema.imp.restservice.data_treatment.DataTreatment.<init>(DataTreatment.scala:34)
    at com.infosistema.imp.restservice.data_treatment.Main$.<init>(DataTreatment.scala:45)
    at com.infosistema.imp.restservice.data_treatment.Main$.<clinit>(DataTreatment.scala)
    at com.infosistema.imp.restservice.data_treatment.Main.main(DataTreatment.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.ClassNotFoundException: org.tukaani.xz.XZInputStream
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 46 more

我不知道 R。我只是尝试使用 R 代码在使用 Renjin 的 Java/Scala 应用程序中处理一些数据。

阅读documention 上的数据部分,没有提到从.RData 文件加载数据。

更新: 在我的build.sbt 文件中,我有:

resolvers += "BeDataDriven" at https://nexus.bedatadriven.com/content/groups/public",
libraryDependencies += "org.renjin" % "renjin-script-engine" % "0.8.1886"

【问题讨论】:

    标签: r scala renjin


    【解决方案1】:

    在你的类路径中只有 renjin-script-engine.jar 是不够的,你还需要它的依赖项。

    如果您使用 SBT 构建您的 Scala 项目,那么您需要将以下内容添加到您的构建文件中:

    resolvers +=
      "BeDataDriven" at "https://nexus.bedatadriven.com/content/groups/public"
    
    lazy val root = (project in file(".")).
      settings(
        name := "renjin-test",
        version := "1.0",
        scalaVersion := "2.10.6",
        libraryDependencies += "org.renjin" % "renjin-script-engine" % "0.8.1886"
    )
    

    有关其他构建工具,请参阅: http://docs.renjin.org/en/latest/library/project-setup.html

    【讨论】:

    • 我的build.sbt 中确实有该依赖项和存储库。我不止一次地从头到尾阅读了文档第 4 点。另外这没有多大意义,因为当我将 .jar 放在类路径中时,我不必担心它的依赖关系,否则每个项目都会有数百个非直接依赖关系。由构建系统来确定您的依赖项的依赖项。
    • 尽管如此 - 你的类路径有问题,因为 org.tukaani.xz.XZInputStream 不在它上面。此类位于 org.tukaani:xz:1.0 工件中,通常应在类路​​径中显示为 xz-1.0.jar。仔细检查 JVM 的实际命令行以找出问题所在!
    • 我同意它不在类路径中(我检查过)。但根据 renjin 文档,我不需要其他依赖项,除了:"org.renjin" % "renjin-script-engine" % "0.8.1886"
    • 你可以直接从 sbt 运行应用程序吗?您可以将 mainClass := Some("com.infosistema.imp.restservice.data_treatment.Main") 行添加到构建文件中,然后执行“sbt run”。如果运行没有错误,则可能是 IntelliJ 的问题。
    【解决方案2】:

    问题是coursier 无法解决所有依赖项(没有任何通知)。

    plugins.sbt 中删除 addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.0-M15") 并使用 sbt 的默认解析器解决了该问题。

    【讨论】:

    • 呸!很高兴您能够解决问题! coursier 的问题是专门针对 Renjin 还是其他依赖项?
    • 显然它无法解析org.tukaani:xz。使用 coursier 一个多月,这是它第一次“失败”。仍在试图找出原因......
    • 我正在尝试重现这一点,以便我们可以向 coursier 提交错误报告,但我的超级简单项目似乎可以工作:github.com/bedatadriven/renjin-sbt-example/tree/coursier你使用的是什么版本的 scala?
    • 2.11.8.我解决了一个问题,但还没有费心创建一个最小的工作示例。
    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多