2014-04-09 2 views
3

저는 스칼라 애플리케이션을 실행 중이며 Renjin을 사용하여 R 파일을 호출하고 scala에서 R 파일로 값을 전달하려고합니다. 스칼라에서 R 파일을로드 할 때 찾을 수없는 패키지에 오류가 발생합니다. Renjin을 사용하여 R 패키지를 스칼라에로드하는 방법을 알려주는 것이 좋으면 좋을 것입니다. 다음은 Scala 또는 Java의 Renjin에 패키지로드

내가
  1. Renjin

    사용하여 R 파일을 호출하는 스칼라에서 사용되는 코드 복사 한 다음 명령

    스칼라 -cp renjin - 스크립트 엔진 0.7를 사용하여 종속성 JAR 파일. 0-RC6-jar-dependencies.jar

  2. 이제 스칼라 인터프리터가 시작되었습니다.

    import javax.script. ; import org.renjin.sexp.;

    val factory = new ScriptEngineManager();

//에 R 엔진

val engine = factory.getEngineByName("Renjin"); 

//이 단계에서 디스크

engine.eval(new java.io.FileReader("myscript.R")); 

에 R 스크립트를 평가를 만들 수는 계속이

'lapply'기능을 찾을 수 없습니다 오류 Renjin에 패키지를 어떻게 추가합니까? 클래스 경로를 어디에 추가합니까? 다음은

질문의

score.sentiment = function (sentences, pos.words,neg.words, .progress='none') 
{ 
    require(plyr) 
    require(stringr) 

    scores = laply(sentences, function(sentence,pos.words,neg.words){ 

    sentence = gsub('[[:punct:]]','',sentence) 
    sentence = gsub('[[:cntrl:]]','',sentence) 
    sentence = gsub('\\d+','',sentence) 
    sentence = tolower(sentence) 

    word.list = str_split(sentence, '\\s+') 
    words = unlist(word.list) 

    pos.matches = match(words, pos.words) 

    neg.matches = match(words, neg.words) 

    pos.matches = !is.na(pos.matches) 

    neg.matches = !is.na(neg.matches) 

    score = sum(pos.matches) - sum (neg.matches) 

    return(score) 

    },pos.words, neg.words, .progress = .progress) 

    scores.df = data.frame(score=scores, text=sentences) 

    return(scores.df) 

} 

두 번째 부분은 내가이 R 파일에 스칼라 콘솔에서 매개 변수를 전달 어떻게입니다 R 파일에 대한 코드입니다.

예문은 트윗입니다. 스칼라에서 R 함수로 보내고 싶습니다.

답변

0

나는 plyr 또는 stringr이 Renjin과 함께 즉시 사용 가능하다고 생각하지 않습니다. 체크하지는 않았지만, plyr은 GNU R의 C Api로 꽤 많은 마법을 사용한다고 생각합니다. Renjin은 stringr의 테스트 함수 중 일부에서 choke 인 것처럼 보입니다.

그러나 위의 함수 중 하나라도 필요하다고 생각하지 않습니다. laply와 str_split을 기본 패키지의 sapply와 strsplit으로 바꿉니다. 위했던대로 함수 정의를 평가하면

, 당신은 [invokeFunction] (http://docs.oracle.com/javase/7/docs/api/javax/script/Invocable.html#invokeFunction(java.lang.String, java.lang.Object 상위 ...)) 방법을 사용하여 스칼라/자바에서이 함수를 호출 할 수 있습니다

((Invocable)engine).invokeFunction("score.sentiment", 
     "Best pizza EVER!", 
     new String[] { "best", "cool" }, 
     new String[] { "sucks", "awful" }); 

Renjin은 문자열 배열을 StringVector 객체 (R 문자 객체)로 변환하지만 사용자가 직접 StringVector 객체를 만들 수도 있습니다.

http://docs.oracle.com/javase/7/docs/api/javax/script/Invocable.html#invokeFunction(java.lang.String, java.lang.Object 상위 ...)

0

나는 jvmr 사용하여 스칼라 R 패키지를 사용 할 수 있었다.다음은 샘플 코드입니다.

package org.scala.rtest 

import org.ddahl.jvmr.RInScala 

object RIntegration { 
    def main(args: Array[String]) { 
     val R = RInScala() 
     R>""" 
      require(sparkR) 

      score.sentiment = function(sentences, pos.words, neg.words, .progress='none') 
       { 
        require(plyr) 
        require(stringr) 


        scores = laply(sentences, function(sentence, pos.words, neg.words) { 

        # clean up sentences with R's regex-driven global substitute, gsub(): 

        sentence = gsub('[[:punct:]]', '', sentence, ignore.case=T) 

        sentence = gsub('[[:cntrl:]]', '', sentence, ignore.case=T) 

        sentence = gsub('\\d+', '', sentence, ignore.case=T) 

        # and convert to lower case: 

        sentence = tolower(sentence) 

        # split into words. str_split is in the stringr package 

        word.list = str_split(sentence, '\\s+') 

        # sometimes a list() is one level of hierarchy too much 

        words = unlist(word.list) 

        # compare our words to the dictionaries of positive & negative terms 

        pos.matches = match(words, pos.words) 
        neg.matches = match(words, neg.words) 

        # match() returns the position of the matched term or NA 
        # we just want a TRUE/FALSE: 

        pos.matches = !is.na(pos.matches) 

        neg.matches = !is.na(neg.matches) 

        # and conveniently enough, TRUE/FALSE will be treated as 1/0 by sum(): 

        score = sum(pos.matches) - sum(neg.matches) 

        return(score) 

        }, pos.words, neg.words, .progress=.progress) 
        scores.df = data.frame(score=scores, text=sentences) 
        return(scores.df) 
       } 


     """ 

     R(" x <- scan('positive-words.txt',what='character',comment.char=';')") 
     R(" y <- scan('negative-words.txt',what='character',comment.char=';')") 
     R(" z <- scan('twitterstream1.txt', what='character')") 

     R.eval("df <- score.sentiment(z,x,y)") 
     println(R.capture("df")) 

     } 
} 

희망이 있으면 도움이 될 것입니다.