【问题标题】:RserveException: eval failed Syntax errorRserveException: eval failed 语法错误
【发布时间】:2017-09-07 11:21:17
【问题描述】:

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

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

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. 我还尝试通过 eval 将整个数据分配给 R 变量,然后运行该函数

新更新 - 问题已解决

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

谢谢大家!! :) 检查我的答案以获得描述! :)

【问题讨论】:

    标签: java r eval rserve


    【解决方案1】:

    错误在于

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

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

    解决方案:只需在传递给eval 函数之前附加lstrRawData

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

    【讨论】:

    • 谢谢,但没用。我的 java 代码可以正确地与其他 R 函数一起使用。我认为错误是因为数据中出现了多个单引号。
    • @RugvedModak 只需添加 '\' 即可解决问题,请参阅更新的答案
    • 谢谢,但是我知道正则表达式,但也没有用。
    • 感谢您的快速回复。
    【解决方案2】:

    转义字符是问题所在。为了解决这个问题,我转义了转义和引号。 我创建了这个方法来使它更简单:

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

    我在上述函数中再次转义了转义字符,以便它们在 R 函数中也被转义。

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

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 2015-01-11
      • 2011-12-14
      • 1970-01-01
      • 2020-10-10
      • 2011-07-25
      • 2011-10-05
      • 2017-12-25
      • 1970-01-01
      相关资源
      最近更新 更多