Closed tuh8888 closed 3 years ago
We haven't tested clojisr
on R 4.0.0, maybe this is an issuse?
Can you also try 1.0.0-BETA11-SNAPSHOT
.
Also check if that port is accessible (not blocked by firewall). Port is selected randomly.
After downgrading to R 3.6.3 and then reinstalling Rserve (making sure that I got v1.8.6) and making sure that there were no sessions caches (r/discard-all-sessions)
, I got it to reliably startup with clojisr 1.0.0-BETA10
and clojisr 1.0.0-BETA11-SNAPSHOT
. I look forward to now getting to try this thing out!
It might be worth noting in the README that R 4.0.0 doesn't work atm.
As I was testing things, trying to get this to work, I noticed a design decision that makes it really difficult to get going. In r.clj
, there are a series of statements e.g.
(def r== (r "`==`"))
that attempt to establish a connection when requiring
(require '[clojisr.v1.r :as r])
If the connection refuses during the require, then the require will fail and the namespace will not be loaded. When this happens, I couldn't attempt to re-require (if I do I get No such namespace: r
) and so must restart the whole REPL.
If those def
statements weren't in there, then I could make changes to my environment like fixing the R and Rserve versions, without constantly having to reinit the REPL.
Thanks for your comment and test against R4 (I wasn't aware it was available already).
Regarding session establishing. We are aware of this problem and currently Daniel is rewriting session management to make connection when it's requested by user call. So this problem will vanish. Stay tuned.
Hi, maybe it is worth reopening this issue. I also get
10:28:28.156 [main] INFO clojisr.v1.impl.rserve.proc - [:clojisr.v1.impl.rserve.proc/spawn {:process ("/usr/local/bin/R" "--no-save" "--slave" "-e" "library(Rserve); run.Rserve(port=50197);")}] { }
Execution error (ConnectException) at java.net.PlainSocketImpl/socketConnect (PlainSocketImpl.java:-2).
Connection refused (Connection refused)
I installed latest Rserve as described. I tried to fetch the latest commit on master to see if the problem was with the "--no-restore-data"
flag but no luck.
The funny thing is that if I downgrade to Rserve_1.7-3.1 from CRAN version I can get past the Connection refused but I get the "long vectors not supported yet" error.
Ho can I help you debug this error? As we stand now, I would say that following the installation instruction on the README does not get a first user to a functioning environment :(
Could you give more information about an environment? What system and setup with versions (OS, Java, Clojure, R)?
Rserve 1.7 doesn't work at all with latest Java API.
Also please post full stack trace.
Ok I managed to pinpoint the problem: I must have been left some abandoned R process (even though I ran this command kill $(ps aux | grep 'library(Rserve)' | awk '{print $2}')
to try to kill previous sessions).
After logging out and in, I created a "fresh" R project, ran in an R console:
packrat::init()
install.packages("Rserve",,"http://rforge.net", type="source")
and in a shell:
clj -Sdeps '{:deps {scicloj/clojisr {:mvn/version "1.0.0-BETA10"}}}'
user=> (require '[clojisr.v1.r :refer [r]])
and I could see it succeed.
In the R project I was trying to start up, I was using the newly released renv
(https://github.com/rstudio/renv). After downgrading to packrat
everything worked.
I can't really think of working without (virtual) environments to separate my project dependencies so I think it would be nice to get renv
support at some point because packrat
does not play nicely with Rserve
installed from source.
Are you still interested in my environment details and stacktrace?
Yes, sure, this can be very helpful. Though, we rely on Rserve R<->Java connectivity and it's known to have issues.
Environment:
I got a "Connection refused again" after closing a REPL session and starting another one. It must be because of the abandoned R session described in the README. I ran (clojisr.v1.session/discard-all)
and the problem was solved. Is Rserve the preferred backend? Is there any plan to make it more robust or to switch to something else? Thank you very much for your work!!
Full stacktrace:
clojure.lang.Compiler$CompilerException: Syntax error macroexpanding at (r.clj:118:10).
#:clojure.error{:phase :execution, :line 118, :column 10, :source "r.clj"}
at clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3707)
clojure.lang.Compiler$DefExpr.eval (Compiler.java:457)
clojure.lang.Compiler.eval (Compiler.java:7182)
clojure.lang.Compiler.load (Compiler.java:7636)
clojure.lang.RT.loadResourceScript (RT.java:381)
clojure.lang.RT.loadResourceScript (RT.java:372)
clojure.lang.RT.load (RT.java:459)
clojure.lang.RT.load (RT.java:424)
clojure.core$load$fn__6839.invoke (core.clj:6126)
clojure.core$load.invokeStatic (core.clj:6125)
clojure.core$load.doInvoke (core.clj:6109)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invokeStatic (core.clj:5908)
clojure.core$load_one.invoke (core.clj:5903)
clojure.core$load_lib$fn__6780.invoke (core.clj:5948)
clojure.core$load_lib.invokeStatic (core.clj:5947)
clojure.core$load_lib.doInvoke (core.clj:5928)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$load_libs.invokeStatic (core.clj:5985)
clojure.core$load_libs.doInvoke (core.clj:5969)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$require.invokeStatic (core.clj:6007)
clojure.core$require.doInvoke (core.clj:6007)
clojure.lang.RestFn.invoke (RestFn.java:421)
clojurecast.main$eval1401$loading__6721__auto____1402.invoke (main.clj:1)
clojurecast.main$eval1401.invokeStatic (main.clj:1)
clojurecast.main$eval1401.invoke (main.clj:1)
clojure.lang.Compiler.eval (Compiler.java:7177)
clojure.lang.Compiler.eval (Compiler.java:7166)
clojure.lang.Compiler.load (Compiler.java:7636)
clojurecast.main$eval1397.invokeStatic (NO_SOURCE_FILE:1)
clojurecast.main$eval1397.invoke (NO_SOURCE_FILE:1)
clojure.lang.Compiler.eval (Compiler.java:7177)
clojure.lang.Compiler.eval (Compiler.java:7132)
clojure.core$eval.invokeStatic (core.clj:3214)
clojure.core$eval.invoke (core.clj:3210)
nrepl.middleware.interruptible_eval$evaluate$fn__943.invoke (interruptible_eval.clj:91)
clojure.main$repl$read_eval_print__9086$fn__9089.invoke (main.clj:437)
clojure.main$repl$read_eval_print__9086.invoke (main.clj:437)
clojure.main$repl$fn__9095.invoke (main.clj:458)
clojure.main$repl.invokeStatic (main.clj:458)
clojure.main$repl.doInvoke (main.clj:368)
clojure.lang.RestFn.invoke (RestFn.java:1523)
nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:84)
nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
nrepl.middleware.interruptible_eval$interruptible_eval$fn__969$fn__973.invoke (interruptible_eval.clj:155)
clojure.lang.AFn.run (AFn.java:22)
nrepl.middleware.session$session_exec$main_loop__1070$fn__1074.invoke (session.clj:190)
nrepl.middleware.session$session_exec$main_loop__1070.invoke (session.clj:189)
clojure.lang.AFn.run (AFn.java:22)
java.lang.Thread.run (Thread.java:748)
Caused by: org.rosuda.REngine.Rserve.RserveException: Cannot connect: Connection refused (Connection refused)
at org.rosuda.REngine.Rserve.RConnection.<init> (RConnection.java:90)
org.rosuda.REngine.Rserve.RConnection.<init> (RConnection.java:60)
clojisr.v1.impl.rserve.session$make.invokeStatic (session.clj:115)
clojisr.v1.impl.rserve.session$make.invoke (session.clj:105)
clojisr.v1.session$make.invokeStatic (session.clj:46)
clojisr.v1.session$make.invoke (session.clj:37)
clojisr.v1.session$make_and_init.invokeStatic (session.clj:98)
clojisr.v1.session$make_and_init.invoke (session.clj:97)
clojisr.v1.session$fetch_or_make.invokeStatic (session.clj:104)
clojisr.v1.session$fetch_or_make.invoke (session.clj:102)
clojisr.v1.r$r.invokeStatic (r.clj:23)
clojisr.v1.r$r.doInvoke (r.clj:22)
clojure.lang.RestFn.invoke (RestFn.java:410)
clojure.lang.AFn.applyToHelper (AFn.java:154)
clojure.lang.RestFn.applyTo (RestFn.java:132)
clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3702)
clojure.lang.Compiler$DefExpr.eval (Compiler.java:457)
clojure.lang.Compiler.eval (Compiler.java:7182)
clojure.lang.Compiler.load (Compiler.java:7636)
clojure.lang.RT.loadResourceScript (RT.java:381)
clojure.lang.RT.loadResourceScript (RT.java:372)
clojure.lang.RT.load (RT.java:459)
clojure.lang.RT.load (RT.java:424)
clojure.core$load$fn__6839.invoke (core.clj:6126)
clojure.core$load.invokeStatic (core.clj:6125)
clojure.core$load.doInvoke (core.clj:6109)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invokeStatic (core.clj:5908)
clojure.core$load_one.invoke (core.clj:5903)
clojure.core$load_lib$fn__6780.invoke (core.clj:5948)
clojure.core$load_lib.invokeStatic (core.clj:5947)
clojure.core$load_lib.doInvoke (core.clj:5928)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$load_libs.invokeStatic (core.clj:5985)
clojure.core$load_libs.doInvoke (core.clj:5969)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$require.invokeStatic (core.clj:6007)
clojure.core$require.doInvoke (core.clj:6007)
clojure.lang.RestFn.invoke (RestFn.java:421)
clojurecast.main$eval1401$loading__6721__auto____1402.invoke (main.clj:1)
clojurecast.main$eval1401.invokeStatic (main.clj:1)
clojurecast.main$eval1401.invoke (main.clj:1)
clojure.lang.Compiler.eval (Compiler.java:7177)
clojure.lang.Compiler.eval (Compiler.java:7166)
clojure.lang.Compiler.load (Compiler.java:7636)
clojurecast.main$eval1397.invokeStatic (NO_SOURCE_FILE:1)
clojurecast.main$eval1397.invoke (NO_SOURCE_FILE:1)
clojure.lang.Compiler.eval (Compiler.java:7177)
clojure.lang.Compiler.eval (Compiler.java:7132)
clojure.core$eval.invokeStatic (core.clj:3214)
clojure.core$eval.invoke (core.clj:3210)
nrepl.middleware.interruptible_eval$evaluate$fn__943.invoke (interruptible_eval.clj:91)
clojure.main$repl$read_eval_print__9086$fn__9089.invoke (main.clj:437)
clojure.main$repl$read_eval_print__9086.invoke (main.clj:437)
clojure.main$repl$fn__9095.invoke (main.clj:458)
clojure.main$repl.invokeStatic (main.clj:458)
clojure.main$repl.doInvoke (main.clj:368)
clojure.lang.RestFn.invoke (RestFn.java:1523)
nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:84)
nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
nrepl.middleware.interruptible_eval$interruptible_eval$fn__969$fn__973.invoke (interruptible_eval.clj:155)
clojure.lang.AFn.run (AFn.java:22)
nrepl.middleware.session$session_exec$main_loop__1070$fn__1074.invoke (session.clj:190)
nrepl.middleware.session$session_exec$main_loop__1070.invoke (session.clj:189)
clojure.lang.AFn.run (AFn.java:22)
java.lang.Thread.run (Thread.java:748)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect (PlainSocketImpl.java:-2)
java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java:350)
java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketImpl.java:206)
java.net.AbstractPlainSocketImpl.connect (AbstractPlainSocketImpl.java:188)
java.net.SocksSocketImpl.connect (SocksSocketImpl.java:392)
java.net.Socket.connect (Socket.java:589)
java.net.Socket.connect (Socket.java:538)
java.net.Socket.<init> (Socket.java:434)
java.net.Socket.<init> (Socket.java:211)
org.rosuda.REngine.Rserve.RConnection.<init> (RConnection.java:85)
org.rosuda.REngine.Rserve.RConnection.<init> (RConnection.java:60)
clojisr.v1.impl.rserve.session$make.invokeStatic (session.clj:115)
clojisr.v1.impl.rserve.session$make.invoke (session.clj:105)
clojisr.v1.session$make.invokeStatic (session.clj:46)
clojisr.v1.session$make.invoke (session.clj:37)
clojisr.v1.session$make_and_init.invokeStatic (session.clj:98)
clojisr.v1.session$make_and_init.invoke (session.clj:97)
clojisr.v1.session$fetch_or_make.invokeStatic (session.clj:104)
clojisr.v1.session$fetch_or_make.invoke (session.clj:102)
clojisr.v1.r$r.invokeStatic (r.clj:23)
clojisr.v1.r$r.doInvoke (r.clj:22)
clojure.lang.RestFn.invoke (RestFn.java:410)
clojure.lang.AFn.applyToHelper (AFn.java:154)
clojure.lang.RestFn.applyTo (RestFn.java:132)
clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3702)
clojure.lang.Compiler$DefExpr.eval (Compiler.java:457)
clojure.lang.Compiler.eval (Compiler.java:7182)
clojure.lang.Compiler.load (Compiler.java:7636)
clojure.lang.RT.loadResourceScript (RT.java:381)
clojure.lang.RT.loadResourceScript (RT.java:372)
clojure.lang.RT.load (RT.java:459)
clojure.lang.RT.load (RT.java:424)
clojure.core$load$fn__6839.invoke (core.clj:6126)
clojure.core$load.invokeStatic (core.clj:6125)
clojure.core$load.doInvoke (core.clj:6109)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invokeStatic (core.clj:5908)
clojure.core$load_one.invoke (core.clj:5903)
clojure.core$load_lib$fn__6780.invoke (core.clj:5948)
clojure.core$load_lib.invokeStatic (core.clj:5947)
clojure.core$load_lib.doInvoke (core.clj:5928)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$load_libs.invokeStatic (core.clj:5985)
clojure.core$load_libs.doInvoke (core.clj:5969)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$require.invokeStatic (core.clj:6007)
clojure.core$require.doInvoke (core.clj:6007)
clojure.lang.RestFn.invoke (RestFn.java:421)
clojurecast.main$eval1401$loading__6721__auto____1402.invoke (main.clj:1)
clojurecast.main$eval1401.invokeStatic (main.clj:1)
clojurecast.main$eval1401.invoke (main.clj:1)
clojure.lang.Compiler.eval (Compiler.java:7177)
clojure.lang.Compiler.eval (Compiler.java:7166)
clojure.lang.Compiler.load (Compiler.java:7636)
clojurecast.main$eval1397.invokeStatic (NO_SOURCE_FILE:1)
clojurecast.main$eval1397.invoke (NO_SOURCE_FILE:1)
clojure.lang.Compiler.eval (Compiler.java:7177)
clojure.lang.Compiler.eval (Compiler.java:7132)
clojure.core$eval.invokeStatic (core.clj:3214)
clojure.core$eval.invoke (core.clj:3210)
nrepl.middleware.interruptible_eval$evaluate$fn__943.invoke (interruptible_eval.clj:91)
clojure.main$repl$read_eval_print__9086$fn__9089.invoke (main.clj:437)
clojure.main$repl$read_eval_print__9086.invoke (main.clj:437)
clojure.main$repl$fn__9095.invoke (main.clj:458)
clojure.main$repl.invokeStatic (main.clj:458)
clojure.main$repl.doInvoke (main.clj:368)
clojure.lang.RestFn.invoke (RestFn.java:1523)
nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:84)
nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
nrepl.middleware.interruptible_eval$interruptible_eval$fn__969$fn__973.invoke (interruptible_eval.clj:155)
clojure.lang.AFn.run (AFn.java:22)
nrepl.middleware.session$session_exec$main_loop__1070$fn__1074.invoke (session.clj:190)
nrepl.middleware.session$session_exec$main_loop__1070.invoke (session.clj:189)
clojure.lang.AFn.run (AFn.java:22)
java.lang.Thread.run (Thread.java:748)
What do you mean by closing REPL session? It doesn't mean closing Java, right (closing Java kills R process)? It should be case where connection between java and R is closed (but why?). Anyway - @daslu works on new session management which should help better session management.
Regarding other backends: Renjin - not functional, FastR - hard to manage, there is also Rserve through JRI (rJava) - maybe this is better way that fighting with sockets...
Thank you for your help. By “closing the REPL session” I mean that I had to restart my ‘clj’ session to add a dependency. In that instance I got a connection refused, which I solved by discarding sessions :)
That's strange. Since all the context (like session) lives on JVM. So session connection should be kept. I don't know then what closing REPL session changes on JVM side. I need to experiment with this later.
Ok, I can confirm I've got the same error and it's unpredictable behaviour.
There was very optimistic creation of connection to RServe. My observation was that when system has high load, process and server creation can take more time than expected. Refactoring it to make it safer and try to connect several times before giving up.
Also refactoring will get rid of clojisr.v1.rserve
and clojisr.v1.renjin
namespaces. Default engine is :rserve
. In order to change it you'll need to call clojisr.v1.r/set-default-session-type!
with session type as keyword: :rserve
or :renjin
.
Looks like fixes are working, please wait for BETA14
release
INFO: [:clojisr.v1.session/make-session {:action :new-session, :id nil, :actual-session-args {:session-type :rserve}}]
Jul 10, 2020 1:21:34 PM clojure.tools.logging$eval23572$fn__23575 invoke
INFO: [:clojisr.v1.impl.rserve.proc/spawn {:process ("/usr/bin/R" "--no-save" "--no-restore-data" "--slave" "-e" "library(Rserve); run.Rserve(port=65187);")}]
Jul 10, 2020 1:21:37 PM clojure.tools.logging$eval23572$fn__23575 invoke
WARNING: [:clojisr.v1.impl.rserve.session/make-rserve {:exception {:via [{:type org.rosuda.REngine.Rserve.RserveException, :message "Cannot connect: Connection refused (Connection refused)", :at [org.rosuda.REngine.Rserve.RConnection <init> "RConnection.java" 90]} {:type java.net.ConnectException, :message "Connection refused (Connection refused)", :at [java.net.PlainSocketImpl socketConnect "PlainSocketImpl.java" -2]}], :cause "Connection refused (Connection refused)"}, :message "Exception during connection to RServe, trying once more."}]
Jul 10, 2020 1:21:37 PM clojure.tools.logging$eval23572$fn__23575 invoke
WARNING: [:clojisr.v1.impl.rserve.session/make-rserve {:message "Waiting for connection to the RServe."}]
Jul 10, 2020 1:21:38 PM clojure.tools.logging$eval23572$fn__23575 invoke
INFO: [:clojisr.v1.impl.rserve.session/rserve-print-loop {:action :started, :session-args {:session-type :rserve}}]
-- running Rserve in this R session (pid=23065), 1 server(s) --
[1] "."
user>
BETA14 on clojars now.
Following the steps in the README for testing if the installation works, upon requiring the ns
I am told that the "Connection refused" (see 1. in stacktrace). From what I can tell,
clojisr
is attempting to startRserve
via the commandBy requiring the
rserve
ns first, I can see that this is the default port.I have verified that my
Rserve
package is the recommended version.And I am using
scicloj/clojisr {:mvn/version "1.0.0-BETA10"}
in mydeps.edn
.What am I missing?
Stacktrace: