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:
1 2 3 4 5 6 | #Limpa o Workspace rm (list= ls ()) #Gera dois vetores com distribuição normal: vet1<- rnorm (1000,1,1) vet2<- rnorm (1000,3,4) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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); } } |
1 2 3 4 5 6 7 8 | #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 () |
1 2 3 4 5 | #Inicia o arquivo compilado (LoopsAninhados.class): loopAninhado <- .jnew ( "LoopsAninhados" ) #Pega a matriz resultante: distMat <- .jcall (loopAninhado, "[[D" , "DistanciaComputo" , .jarray (vet1), .jarray (vet2), simplify=T) |
- 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... ;-)