来自Clojure的rJava

来自Clojure的rJava,r,clojure,rjava,clojure-java-interop,R,Clojure,Rjava,Clojure Java Interop,我正在尝试使用Clojure中的R,如图所示。我有以下资料: (ns prototype.core (:gen-class) (:require [prototype.dataGraph :as dg]) (:import [org.rosuda.JRI Rengine])) (defn -main "Program main entry point." [& args] (new Rengine (into-array String ["--no-save"]

我正在尝试使用Clojure中的R,如图所示。我有以下资料:

(ns prototype.core
  (:gen-class)
  (:require [prototype.dataGraph :as dg])
  (:import [org.rosuda.JRI Rengine]))

(defn -main
  "Program main entry point."
  [& args]
  (new Rengine (into-array String ["--no-save"]) false nil)
  (println "Hello."))
然后,我得到了stacktrace

找不到JRI本机库!请确保JRI本机 库位于java.library.path中列出的目录中

java.lang.UnsatisfiedLinkError:java.library.path中没有jri

看来我没有正确指定库的位置

Java构造函数的形式如下:

Rengine engine = new Rengine(new String[] { "--no-save" }, false, null);
My project.clj文件:


rJava能否成功地与Clojure一起使用?

是的,因此问题在于java.library.path中没有正确指定共享库。这项工作:

(defproject prototype "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]]
  :plugins [[lein-expand-resource-paths "0.0.1"]]
  :resource-paths ["/usr/lib/R/site-library/rJava/jri/JRI.jar" "/usr/lib/R/site-library/rJava/jri/JRIEngine.jar" "/usr/lib/R/site-library/rJava/jri/REngine.jar"]
  :jvm-opts [~(str "-Djava.library.path=/usr/lib/R/site-library/rJava/jri/:" (System/getenv "$LD_LIBRARY_PATH"))]
  :main ^:skip-aot prototype.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})

是的,所以问题是java.library.path中没有正确指定共享库。这项工作:

(defproject prototype "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]]
  :plugins [[lein-expand-resource-paths "0.0.1"]]
  :resource-paths ["/usr/lib/R/site-library/rJava/jri/JRI.jar" "/usr/lib/R/site-library/rJava/jri/JRIEngine.jar" "/usr/lib/R/site-library/rJava/jri/REngine.jar"]
  :jvm-opts [~(str "-Djava.library.path=/usr/lib/R/site-library/rJava/jri/:" (System/getenv "$LD_LIBRARY_PATH"))]
  :main ^:skip-aot prototype.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})

rJava用于从R调用Java,而不是相反。@Hong Ooi好吧,如果我理解这家伙的工作,它似乎是可行的。。。rJava用于从R调用Java,而不是相反。@Hong Ooi好吧,如果我理解这家伙的工作,它似乎是可行的。。。