我有这段代码:
import org.rosuda.REngine.Rserve.RConnection;
public class TestProgram {
public static void main(String[] args) {
try {
RConnection rConnection = new RConnection();
// make a new local connection on default port (6311)
rConnection.eval("for(i in 1:.Machine$integer.max){}");
System.out.println("Done!");
}
catch(Exception e) {
System.out.println(e.toString());
}
}
}
我得到了这个例外:
org.rosuda.REngine.Rserve.RserveException: eval failed, request status: error code: 127
如果我改变:
rConnection.eval(“for(i in 1:.Machine $ integer.max){}”);
到
rConnection.eval(“for(i in 1:777){}”);
确实有效: - )
有谁知道发生了什么事?
P.S我使用以下方式从R(同一台机器)开始Rserve:
>library(Rserve)
>Rserve()
> sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Rserve_1.7-3
loaded via a namespace (and not attached):
[1] tools_3.0.1
操作系统是Windows 8.我没有在Linux上试试这个。
答案 0 :(得分:2)
您应该检查eval函数的返回值,看它是否扩展了try-error。如果是,则将其打印到调试字符串以获取错误消息。以下部分取自Rserve文档。这将为您提供导致127的错误消息。您还应该使用parseAndEval而不仅仅是eval。
http://www.rforge.net/Rserve/faq.html
c.assign(".tmp.", myCode);
REXP r = c.parseAndEval("try(eval(parse(text=.tmp.)),silent=TRUE)");
if (r.inherits("try-error")) System.err.println("Error: "+r.toString())
else { // success .. }
如果您的R环境受到限制,您可能还需要检查此链接。
R - Big Data - vector exceeds vector length limit
编辑:修正Chris Hinshaw的回答c.assign(".tmp.", myCode);
REXP r = c.parseAndEval("try(eval(parse(text=.tmp.)),silent=TRUE)");
if (r.inherits("try-error")) System.err.println("Error: " + r.asString())
else { // success .. }
请注意,println应使用asString(),而不是toString()