2012-01-12 13 views
6

Llamo a una función R desde el paquete R e1071 que está interconectado con libsvm (un programa C). Esta función pasa mensajes de advertencia C (printf) a la consola R. Lo sé porque los mensajes de advertencia son de la forma (advertencia: ...) mientras que los mensajes de advertencia R están en mayúscula (es decir, Advertencia: ...).Suprimir mensajes de advertencia C en R

He intentado todo para deshacerme de estos mensajes en R (sink, suppressWarnings, invisible) pero nada parece funcionar.

¿Alguna idea?

Gracias!

+0

¿Por qué tan vago? ¿Estás interactuando con libsvm a través de un paquete R? ¿O estás trabajando en algo personalizado? GCC es un compilador, dudo que las advertencias en tiempo de ejecución provengan de él, más probablemente sean printfs en el código de libsvm C. – Mark

+0

paquete yep e1071 - Creo que tiene razón, los mensajes provienen de una declaración printf. ¿Debo ingresar al código C y eliminarlo? o hay algo que pueda hacer desde R? – Michael

+0

tampoco recuerdo haber instalado nunca libsvm en mi máquina, acabo de descargar el paquete R. ¿Eso significa que el código fuente libsvm está en el paquete R? – Michael

Respuesta

9

La función utiliza stdio en lugar de Rprintf/REprintf o warning por lo que re-dirección de la salida R no funcionará. La solución adecuada es arreglar las llamadas en libsvm para usar la salida R en su lugar.

Hackear el stdio de salida es posible - se puede volver a dirigir la salida a su propia tubería y hacer lo que quiera con él, pero a) es un poco de trabajo en C y B) que es peligroso porque es necesario para restaurar el comportamiento estándar una vez que haya terminado con la función, incluso si se produce un error yc) puede interactuar con la salida R si se usa en un shell.

Si desea una solución rápida sin embargo, muy loco, sucio, ejecutar su función en collect(parallel(..., silent=TRUE))[[1]] de multicore - se suprime la salida estándar (se puede añadir multicore:::closeStderr() si desea suprimir stderr también).

Cuestiones relacionadas