Instalando RSPerl (e intentando no morir en el intento)

RSPerl es un paquete que intenta tender un puente bidireccional entre Perl y R, de forma que desde un programa escrito en Perl se pueda llamar funciones de R, y desde un programa en R se puedan usar código y módulos de Perl. Suena como un sueño, ¿no?

Mi compañera de trabajo Kristina estuvo hace unos días intentando instalar RSPerl en la última versión disponible de Ubuntu (11.04, Natty), pero el instalador no terminaba de funcionar (varios errores). Me piqué, e intenté hacer lo mismo en un ordenador con Gentoo, y me daba errores diferentes… Como esto empezaba a parecerse a un Expediente X, con lo aprendido he decidido escribir esta entrada de blog, para que si tenéis la necesidad imperiosa de instalar este paquete, no os tropecéis con los mismos muros.

Lo primero de todo es que la última release de RSPerl es antediluviana (0.92-1 del 2 de Agosto de 2007, casi 4 años), lo que indica que no está siendo mantenido. Para más INRI desde entonces ha llovido mucho en el lado de Perl. Es un milagro que el paquete todavía funcione, teniendo en cuenta que este paquete compila una extensión nativa al ser instalado. Personalmente recomiendo usar directamente llamadas a R o Rscript (aquí tenéis un tutorial para iniciaros en el scripting en R), o desde el lado de Perl usar el paquete Statistics::R, que sí que está siendo mantenido y no tiene tantas dependencias.

Para Ubuntu, sobre el papel las precondiciones son instalar los paquetes de Ubuntu libperl-dev, r-base y r-base-dev, ya sea mediante Synaptic o por línea de comandos con apt-get install. Una vez instalados los paquetes, siguiendo las instrucciones de la página de RSPerl todo debería funcionar… pero aquí nos tropezamos con la realidad. Siguiendo los mismos pasos en distintas instalaciones similares (pero no iguales) de Ubuntu 11.04, en unas funcionaba y en otras daba errores difíciles de descifrar (y de resolver).

Intentando instalar RSPerl en Gentoo descubrí además que el siguiente problema lo vais a tener si intentáis instalar RSPerl en una máquina UNIX o Linux con Perl 5.12 (o superior):

i686-pc-linux-gnu-gcc -std=gnu99 -I/usr/lib/R/include -I.  -fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib/perl5/5.12.3/i686-linux/CORE  -DPERL_POLLUTE   -D_R_=1 -DUSE_R=1 -DUSE_TOPLEVEL_EXEC=1 -DWITH_R_IN_PERL=1 -I/usr/local/include    -fpic  -march=core2 -O2 -fomit-frame-pointer -falign-functions=64 -pipe -c Converters.c -o Converters.o
Converters.c: In function ‘PerlAddHomogeneousElement’:
Converters.c:1056: error: duplicate case value
Converters.c:1041: error: previously used here
make: *** [Converters.o] Error 1

La compilación del módulo nativo de RSPerl falla en Perl 5.12.x (o superior) porque con la versión 5.12 cambió el manejo interno de los punteros en Perl (y por ello salta el error de duplicate case value al compilar el paquete). Eso no pasa en las versiones anteriores de Perl (5.10.x, 5.8.x, …). La solución de matar moscas a cañonazos, cuando es posible, es hacer un desactualización a una versión de Perl que sea 5.10.x . Los usuarios de Ubuntu están de suerte todavía, porque la versión 11.04 aún lleva un Perl 5.10.x, pero la próxima Ubuntu 11.10 llevará un Perl 5.12.x, así que…

La solución buena en caso de necesitar impepinablemente RSPerl sería parchearlo para que funcionara con Perl 5.12.x, pero por los intentos que he hecho os puedo contar que no son triviales los cambios que hay que introducir. También sería un detalle que sacaran una nueva versión de RSPerl, pero como no parece que vaya a ocurrir, la solución real para llamar a R desde Perl pienso que es la que recomendé: o usar un módulo alternativo, como por ejemplo Statistics::R, o usar llamadas directas a R o Rscript.

Compartir:

Un comentario

Deja un comentario