开发者

Using R from Scala and invoking Scala from R?

Do you know something about possibilites of

Best regards

Raffael


Check out the jvmr package in R available on CRAN. It allows you to:

  1. embed the R interpreter in Scala
  2. embed the Scala interpreter/compiler in R.

It also allows you to do the same with Java. An article describing its usage is here. (Disclosure: I'm the author.)


There is an R package on CRAN for exactly this purpose, called "rscala". It allows bi-directional calling (R from Scala and Scala from R), as well as callbacks (eg. calling back to R from Scala code called from R). It is well documented. This package replaces the "jvmr" package mentioned in another answer.


I don't know if there is direct Scala interface, but rJava http://www.rforge.net/rJava/ should help.


I was able to achieve it using jvmr. The code below is sample apache spark application i am running from scala console.

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"))

        }
}

Hope this helps.


One can use rJava but I'm not confident that this is the best way.


https://github.com/hughleat/scala2R

I wrote this while learning Scala. Not sure if it works anymore. It was a little DSL wrapping JRI. Probably macros et al could do a lot better now.


JRI which is part of rJava might be what your looking for

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜