Open ESRSAN2 opened 7 months ago
The Renjin-versions of packages are produced by compiling C or C++ code to JVM bytecode, and it looks like there is a problem with our compiler here. It seems to compile a certain operation to a call to Integer.remainderUnsigned():
However, this Java method throws a ArithmeticException on divide by zero, while obviously the corresponding machine instruction emitted by GCC does not. This can be fixed by providing our own static method which does the check for a zero divisor, but I suspect something else is going wrong which leads to a zero divisor.
Unfortunately, debugging compiled C++ code is quite difficult, as it turns out.
You can see the method in dplyr that triggers the exception here: https://github.com/tidyverse/dplyr/blob/v0.8.2/src/hybrid.cpp#L60
You can demangle the stacktrace using c++filt
, which gives the following stacktrace:
boost::unordered::detail::prime_policy<unsigned int>::to_bucket(unsigned int, unsigned int)
boost::unordered::detail::table<boost::unordered::detail::map<std::allocator<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> >, SEXPREC*, dplyr::hybrid::hybrid_function, boost::hash<SEXPREC*>, std::equal_to<SEXPREC*> > >::hash_to_bucket(unsigned int) const
boost::unordered::detail::ptr_node<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> >* boost::unordered::detail::table<boost::unordered::detail::map<std::allocator<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> >, SEXPREC*, dplyr::hybrid::hybrid_function, boost::hash<SEXPREC*>, std::equal_to<SEXPREC*> > >::find_node_impl<SEXPREC*, std::equal_to<SEXPREC*> >(unsigned int, SEXPREC* const&, std::equal_to<SEXPREC*> const&) const
boost::unordered::detail::table<boost::unordered::detail::map<std::allocator<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> >, SEXPREC*, dplyr::hybrid::hybrid_function, boost::hash<SEXPREC*>, std::equal_to<SEXPREC*> > >::find_node(unsigned int, SEXPREC* const&) const
std::pair<boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> > >, bool> boost::unordered::detail::table<boost::unordered::detail::map<std::allocator<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> >, SEXPREC*, dplyr::hybrid::hybrid_function, boost::hash<SEXPREC*>, std::equal_to<SEXPREC*> > >::emplace_unique<boost::unordered::detail::emplace_args1<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> > >(SEXPREC* const&, boost::unordered::detail::emplace_args1<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> > const&)
std::pair<boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> > >, bool> boost::unordered::detail::table<boost::unordered::detail::map<std::allocator<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> >, SEXPREC*, dplyr::hybrid::hybrid_function, boost::hash<SEXPREC*>, std::equal_to<SEXPREC*> > >::emplace_unique<boost::unordered::detail::emplace_args1<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> > >(SEXPREC* const&, boost::unordered::detail::emplace_args1<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> > const&)
std::pair<boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> > >, bool> boost::unordered::unordered_map<SEXPREC*, dplyr::hybrid::hybrid_function, boost::hash<SEXPREC*>, std::equal_to<SEXPREC*>, std::allocator<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> > >::emplace<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> >(std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> const&)
boost::unordered::unordered_map<SEXPREC*, dplyr::hybrid::hybrid_function, boost::hash<SEXPREC*>, std::equal_to<SEXPREC*>, std::allocator<std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> > >::insert(std::pair<SEXPREC* const, dplyr::hybrid::hybrid_function> const&)
dplyr::hybrid::hybrid_init(SEXPREC*, SEXPREC*, SEXPREC*, dplyr::hybrid::hybrid_id)
dplyr::hybrid::init()
init_hybrid_inline_map(_DllInfo*)
Unfortuantely, unless you're willing to wade through all of this I'm afraid you're not going to be able to use dplyr with Renjin. If I look at the test page none of the tests have ever passed with Renjin.
Without dplyr and tidyr library (only with data.table, lubridate and sqldf), I get this exception now:
org.renjin.eval.EvalException: missing value where TRUE/FALSE needed
at org.renjin.sexp.SpecialFunction.asLogicalNoNA(SpecialFunction.java:71) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.primitives.special.IfFunction.apply(IfFunction.java:39) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.sexp.FunctionCall.eval(FunctionCall.java:80) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.primitives.special.BeginFunction.apply(BeginFunction.java:39) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.sexp.FunctionCall.eval(FunctionCall.java:80) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.sexp.Closure.applyPromised(Closure.java:200) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.sexp.Closure.apply(Closure.java:133) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.sexp.FunctionCall.eval(FunctionCall.java:80) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.primitives.special.AssignLeftFunction.assignLeft(AssignLeftFunction.java:58) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.primitives.special.AssignLeftFunction.apply(AssignLeftFunction.java:42) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.sexp.FunctionCall.eval(FunctionCall.java:80) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.sexp.ExpressionVector.eval(ExpressionVector.java:85) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.eval.Context.evaluate(Context.java:280) ~[renjin-core-3.5-beta76.jar:na]
at org.renjin.script.RenjinScriptEngine.eval(RenjinScriptEngine.java:174) ~[renjin-script-engine-3.5-beta76.jar:na]
at org.renjin.script.RenjinScriptEngine.eval(RenjinScriptEngine.java:169) ~[renjin-script-engine-3.5-beta76.jar:na]
at org.renjin.script.RenjinScriptEngine.eval(RenjinScriptEngine.java:148) ~[renjin-script-engine-3.5-beta76.jar:na]
at com.atradius.Rjavaintegrationdemo.service.RJavaService.getResult(RJavaService.java:17) ~[classes/:na]
at com.atradius.Rjavaintegrationdemo.controller.RJavaController.getResult(RJavaController.java:20) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:254) ~[spring-web-6.1.1.jar:6.1.1]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:182) ~[spring-web-6.1.1.jar:6.1.1]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.1.jar:6.1.1]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:917) ~[spring-webmvc-6.1.1.jar:6.1.1]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:829) ~[spring-webmvc-6.1.1.jar:6.1.1]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.1.jar:6.1.1]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.1.jar:6.1.1]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.1.jar:6.1.1]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.1.jar:6.1.1]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.1.jar:6.1.1]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.16.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.1.jar:6.1.1]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.16.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.16.jar:10.1.16]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.1.jar:6.1.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.1.jar:6.1.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.1.jar:6.1.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.1.jar:6.1.1]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.16.jar:10.1.16]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Hi all, I have a spring boot 3 service that integrates a R rate calculation script to be run into it. The problem here is I can't understand the exception I get when run:
These are my Renjin libraries in my POM:
and here the R integration code:
Any help'll be apreciated!