RserveException:eval failed语法错误

时间:2017-09-07 11:21:18

标签: java r eval rserve

我有一个R函数,可以从html页面中删除所有html数据。 它在R中运行时有效 但是当我通过Rserve运行它时会产生错误:

  

线程“main”中的异常org.rosuda.REngine.Rserve.RserveException:   eval失败,请求状态:R parser:语法错误

at org.rosuda.REngine.Rserve.RConnection.eval(RConnection.java:234)
at CereScope_Data.main(CereScope_Data.java:80)

Java Eval我收到错误的地方:

REXP lstrRemoveHtml = cobjConn.eval("RemoveHtml('" + lstrRawData + "')");

我的R功能: rawdata是一个HTML页面

RemoveHtml <- function(rawdata) {

  library("tm")

  ## Convering Data To UTF-8 Format
  ## Creating Corpus
  Encoding(rawdata) <- "latin1"
  docs <- Corpus(VectorSource(iconv(rawdata, from = "latin1", to = "UTF-8", sub = "")))

  toSpace <- content_transformer(function(x , pattern) gsub(pattern, " ", x))

  docs <- gsub("[^\\b]*(<style).*?(</style>)", " ", docs)
  docs <- Corpus(VectorSource(gsub("[^\\b]*(<script).*?(</script>)", " ", docs)))
  docs <- tm_map(docs, toSpace, "<.*?>")
  docs <- tm_map(docs, toSpace, "(//).*?[^\n]*")
  docs <- tm_map(docs, toSpace, "/")
  docs <- tm_map(docs, toSpace, "\\\\t")
  docs <- tm_map(docs, toSpace, "\\\\n")
  docs <- tm_map(docs, toSpace, "\\\\")
  docs <- tm_map(docs, toSpace, "@")
  docs <- tm_map(docs, toSpace, "\\|")

  docs <- tm_map(docs, toSpace, "\\\"")
  docs <- tm_map(docs, toSpace, ",")
  RemoveHtmlDocs <- tm_map(docs, stripWhitespace)

  return(as.character(RemoveHtmlDocs)[1])
}
  

更新 - 我尝试过的事情

     
    
        
  1. 转义可能导致单引号和双引号以及反斜杠等问题的字符
  2.     
  3. 我还尝试通过eval将整个数据分配给R变量,然后运行函数
  4.        
     

新更新 - 解决问题

     
    
        
  1. 转义字符导致单引号和双引号和反斜杠等问题
  2.     
  3. 另一条不再需要的行导致了问题,因为我没有评论或删除它。
  4.        

全部谢谢!! :) 检查我的答案说明!! :)

2 个答案:

答案 0 :(得分:1)

错误在于

REXP lstrRemoveHtml = cobjConn.eval("RemoveHtml('" + lstrRawData + "')");

  

在Java中,\是一个转义字符。所以它逃脱了"的含义,它意味着充当r表达式

解决方案:在传递给lstrRawData函数

之前,只需添加eval即可
exp = "RemoveHtml(\"" + lstrRawData + "\")";
REXP lstrRemoveHtml = cobjConn.eval(exp)

答案 1 :(得分:0)

逃脱角色是个问题。为了解决这个问题,我逃脱了逃脱和行情。 我创建了这个方法,使其更简单:

public static String Regexer(String Data) {
    String RegexedData = Data.replaceAll("\\\\", "\\\\\\\\").replaceAll("'", "\\\\'").replaceAll("\"", "\\\\\"");
    return (RegexedData);
}

我在上面的函数中再次跳过了Escaped字符,这样它们也可以在R函数中转义。

提示:不要忘记将REXP转换为Java变量。 :)