close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Version 5 (modified by Pedro Gea, 9 years ago) (diff)

--

TolRInside

Introducción

El paquete TolRInside de TOL permite la comunicación natural de TOL con R.

Es el paquete equivalente al paquete tolLink de R, pero en el otro sentido de la comunicación. Aunque en principio éstos podrían ser independientes, como veremos, juntos permiten una comunicación bidireccional.

Para poder utilizar TolRInside necesitamos una versión de TOL compatible con R. Para ello disponemos de una variante de TOL compilada con GNU GCC denominada TOL-GNU. Esta versión está disponible en: DownloadTol. Para más detalles sobre la instalación de TOL y R, véase: TOL+R Instalación.

Funciones

El paquete TolRInside publica un conjunto de funciones al ser requerido, de modo que éstas pasan a ser funciones globales en TOL.

La principal de estas funciones es REval y de ella derivan otras como: RCall, RExecute o RLibrary.

REval

La función REval recibe un sólo argumento que corresponde con una expresión de R. El resultado de su evaluación será exportado a TOL y devuelto como salida de la llamada a REval si existe el mecanismo de conversión oportuno.

Ejemplos:

// Conjunto de atributos con la versión de R en uso:
Set REval("version"); 
// Texto con la versión de R
Text REval("version$version.string");
// Con idéentico resultado podemos ejecutar:
Text REval("version")["version.string"]

Errores

Si intentamos obtener un objeto sin conversión en TOL, encontraremos un error. Por ejemplo:

Anything REval("sin");
// > ERROR: [] R class 'function' is not implemented.
// Ya que no está implementada la conversión de un objeto de tipo "function" de R a TOL.

Si evaluamos una expresión con errores obtendremos un error sin ninguna otra información que nos ayude a detectarlo:

// > ERROR: [] Exception caught: Error evaluating: ...

Este tipo de mensaje de error, nos indica básicamente que se encontraron errores intentando evaluar la expresión.

Comunicación de variables

Para trasladar una variable de TOL hasta R, podemos hacer uso del paquete tolLink y concretamente de su función tolGet.

Ejemplos:

// Se carga tolLink en R
Set REval("library(tolLink)");
Real a = 1;
// Se pide a R que obtenga el valor de a y calcule el seno
Real sin_a = REval("sin(tolGet('a'))");

RCall

Nótese, en el ejemplo anterior, que la carga de tolLink devuelve un conjunto que no nos interesa.

Para evitar traer ese resultado u obtener un error en el caso de que la evaluación resulte en un objeto que no puede convertirse podemos acabar nuestra expresión con un número:

Real REval("
library(tolLink)
1
");

o usar la función RCall:

Real RCall("library(tolLink)");

RLibrary

Aún más, para la carga de paquetes en R, hay implementada una función específica: RLibrary. De este modo, simplemente debemos hacer:

Real RLibrary("tolLink");

RExecute

Otro modo de llamar a una función de R y enviar argumentos de TOL es usar RExecute, análoga a la función tolExecute de tolLink.

El primer argumento de la función corresponde con el nombre de la función de R. El segundo es un conjunto con la lista de argumentos a pasar a la función.

Ejemplos:

Real b = 1;
Real sin_b = RExecute("sin", [[b]]);
Real atan_1_2 = RExecute("atan2", [[1, 2]]);

Si queremos pasar a la función un atributo con nombre le antepondremos "__" al nombre de la variable en TOL.

Ejemplo:

// Para llamar a paste("a", "b", sep="-") debemos hacer:
Text RExecute("paste", [["a", "b", Text __sep="-"]]);

Conversión de tipos

Hay mecanismos de conversión para los tipos de objetos correspondientes con los de TOL, véase: Correspondencias de las variables de TOL.

Sin embargo podemos exportar de R otros tipos convirtiéndolos a tipos 'conocidos'.

Ejemplos:

// El objeto USAccDeaths es de clase "ts" (time-serie)
Text REval("class(USAccDeaths)"); // -> "ts"
// No es de la clase "Serie" equivalente a la gramática "Serie" de TOL
// pero puede convertirse con el método as.Serie
Serie REval("as.Serie(USAccDeaths)");

Otra información

Véase TOL_R_Integration?.