我有一个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])
}
更新 - 我尝试过的事情
- 转义可能导致单引号和双引号以及反斜杠等问题的字符
- 我还尝试通过eval将整个数据分配给R变量,然后运行函数
醇>新更新 - 解决问题
- 转义字符导致单引号和双引号和反斜杠等问题
- 另一条不再需要的行导致了问题,因为我没有评论或删除它。
醇>
全部谢谢!! :) 检查我的答案说明!! :)
答案 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变量。 :)