2017-09-07 19 views
0

私はHTMLページからすべてのhtmlデータを削除するR関数を持っています。 私はR でそれを実行するとき、それは動作しますが、私はRserveを通してそれを実行すると、エラー生成します。RserveException:eval failed構文エラー

スレッド「メイン」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の評価:

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でデータを割り当ててから、関数を実行しようとしました。

新しい更新 - 質問は、もはやなどの問題を引き起こしていた必要ではなかったように単一引用符と二重引用符やバックスラッシュ

  • 別のラインなどの問題を引き起こしていた

    1. エスケープ文字を解決します私はそれをコメントしたり削除したりしなかった。
  • おかげですべての! :) 私の回答を確認する説明!! :)

    答えて

    1

    エラーが

    Javaでは

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

    にある、\はエスケープ文字です。だから、ソリューション

    R発現として動作するように意図されて "の意味をエスケープ:ちょうど

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

    ありがとうございましたが、うまくいきませんでした。私のJavaコードは他のR関数と正しく動作します。私はエラーがデータ内で発生する複数の単一引用符のためだと思う。 –

    +0

    @RugvedModakだけで '\'を追加すると問題が解決します。更新された回答を参照してください – parth

    +0

    ありがとうございます。しかし、私は正規表現について知っています。 –

    0

    としてeval関数にエスケープ文字を渡す前にlstrRawDataを追加することは問題でした。この問題を解決するために、私は脱出して引用符を逃した。 私はそれを簡単にするために、このメソッドを作成しました:

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

    それらはまた、Rの関数でエスケープされているように、私は上記の機能に再びエスケープ文字をエスケープ。

    ヒント:REXPをJava変数に変換するのを忘れないでください。 :)