= TolRInside = == Introducción == El paquete {{{TolRInside}}} de TOL permite la comunicación natural de TOL con R. Es el paquete equivalente al paquete [wiki:tolRlink] 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: [wiki:DownloadTol#Extras]. Para más detalles sobre la instalación de TOL y R, véase: [wiki:TolRInstallation 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: {{{ #!java // 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: {{{ #!java 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: {{{ #!java // > 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 [wiki:tolRlink] y concretamente de su función {{{tolGet}}}. Ejemplos: {{{ #!java // Se carga tolRlink en R Set REval("library(tolRlink)"); 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 tolRlink 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: {{{ #!java Real REval(" library(tolRlink) 1 "); }}} o usar la función {{{RCall}}}: {{{ #!java Real RCall("library(tolRlink)"); }}} === 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: {{{ #!java Real RLibrary("tolRlink"); }}} === 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 [wiki:tolRlink]. 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: {{{ #!java 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: {{{ #!java // 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: [wiki:tolRlink#CorrespondenciasdelasvariablesdeTOL Correspondencias de las variables de TOL]. Sin embargo podemos exportar de R otros tipos convirtiéndolos a tipos 'conocidos'. Ejemplos: {{{ #!java // 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 [wiki:TOL_R_Integration].