Java é uma das linguagens mais utilizadas atualmente, principalmente devido ao uso de máquinas virtuais na execução do código, o que permite versatilidade nos mais diversos sistemas operacionais, bem como também velocidade.
O primeiro passo para a utilização do pacote rJava é a instalação do Java SE Development Kit (JDK).
Considere o seguinte exemplo:
#Limpa o Workspace rm(list=ls()) #Gera dois vetores com distribuição normal: vet1<-rnorm(1000,1,1) vet2<-rnorm(1000,3,4)Suponha que desejamos calcular a distância entre cada um dos pares de elementos e armazená-las em uma matriz de dimensão $1000\times1000$. É possível realizar essa operação eficientemente no R utilizando os membros da família apply ou o pacote foreach. Nesse exercício, no entanto, vamos realizar essa operação utilizando o Java e loops aninhados. O código em Java pode ser desenvolvido usando alguma IDE. Uma boa sugestão é utilizar o Eclipse na construção dos códigos em Java. O código em Java utilizado é apresentado a seguir:
public class LoopsAninhados { //Construtor default do JAVA. public static void main(String[] args) { } //Método para a construção da matriz de distâncias private double [ ] [ ] DistanciaComputo(double[] vetor1, double[] vetor2){ //Cria a matriz de distâncias double [ ] [ ] matRes = new double[vetor1.length][vetor2.length]; //Faz o loop aninhado for(int i=0;i < vetor1.length;i++){ for(int j=0; j< vetor2.length;j++){ double d=Math.sqrt(Math.pow(vetor1[i]-vetor2[j],2)); matRes[i][j]=d; } } return(matRes); } }Esse código pode ser simplesmente copiado e colado em um arquivo texto e então renomeado para .java .
#Habilita a biblioteca library(rJava) #Define quanto de memória estará disponível para a VM .jinit(parameters="-Xmx1024m") #Endereço de onde estão os arquivos class gerados .jaddClassPath("C:/Blog/bin") #Endereço do Java e arquivos no class .jclassPath()O próximo passo é enviar os objetos criados anteriormente no R para o Java e então receber o resultado do método LoopsAninhados:
#Inicia o arquivo compilado (LoopsAninhados.class): loopAninhado <- .jnew("LoopsAninhados") #Pega a matriz resultante: distMat <- .jcall(loopAninhado, "[[D", "DistanciaComputo", .jarray(vet1),.jarray(vet2), simplify=T)O comando .jcall possui os seguintes argumentos:
- loopAninhado Nome do método a ser chamado.
- "[[D" Tipo do objeto a ser retornado. Nesse caso um vetor bidimensional double[ ][ ]. Poderia ser ainda: "S" retorna uma String, "[S" retorna um array de String[], "[[S" retorna um array bidimensional de String [ ][ ], "D" retorna um double, "[D" retorna um array de double[], "Z" retorna um boolean, "[Z" retorna um array de boolean[] e "[[Z" retorna um array bidimensional de boolean [ ][ ].
- "DistanciaComputo" Nome do método a ser invocado.
- .jarray(vet1) Primeiro argumento do método "DistanciaComputo". Observe que o método exige que o argumento seja um array, logo usamos a função .jarray() para passar o objeto do R em um array double[] para o Java.
- .jarray(vet2) Segundo argumento do método "DistanciaComputo". Os argumentos são inseridos na ordem em que foram definidos no método em Java.
- simplify=T Converte o objeto array bidimensional do Java em objetos nativos do R como matrizes.
Ao rodar os comandos percebe-se que o loop aninhando é executado de maneira muito mais rápida do que se fossemos utilizar o R para realizar essa função. Tente fazer uma comparação de tempos... ;-)