2012-01-05 15 views
17

Tengo una secuencia de comandos R, que tiene argumentos de línea de comandos, en los que la línea superior es:R Cambiar la escritura de no interactivo a interactiva

#!/usr/bin/Rscript --slave 

que quería interrumpir la ejecución de una función (por lo que puede de forma interactiva use las variables de datos que se han cargado en ese punto para calcular el siguiente bit de código que necesito escribir). Agregué esto dentro de la función en cuestión:

browser() 

pero se ignora. Un poco de búsqueda sugiere que podría ser porque el programa se está ejecutando en modo no interactivo. Pero aún más búsquedas no han rastreado cómo cambio el script fuera del modo no interactivo para que el navegador() funcione. Algo así como una función browser_yes_I_really_mean_it().

P.S. Quiero evitar alterar el resto del script si es posible. Mi enfoque actual es copiar y pegar los fragmentos de código, necesarios para preparar los datos, en una sesión interactiva; pero a medida que el guión se vuelve más y más complejo, esto se vuelve cada vez más irrazonable.

ACTUALIZACIÓN: para cualquier persona con la misma pregunta, parece que la respuesta a la pregunta real es que es imposible. Una vez que inicie R en un modo no interactivo, se arrojará el dado. Las respuestas dadas son, por lo tanto, soluciones temporales: o pirateas tu código (recuerdes deshacerte después) o refactorizas para facilitar la depuración. (Este comentario no pretende ser una crítica de las respuestas; la refactorización sugerida hace que el código sea más limpio de todos modos)

+0

interrupción realmente función compleja? Si se trata de varias funciones, puede hacer lo que mdsumner sugiere a continuación y buscar un conjunto de secuencias de comandos dentro de otra. Luego, después de cada punto de interrupción razonable, escriba los datos en el disco. – Maiasaura

+0

Creo que estás tratando de ir en contra de la lógica fundamental aquí. Tu línea superior significa 'lo que dice el guión, no interactúas'. Ese es todo el punto. Cambia esa línea, ¿qué tan difícil puede ser? – reinierpost

+0

@reinierpost Gracias, aunque la interpretación de 'Rscript --slave' parece no documentada. La página man simplemente dice '--slave' es para silenciarla. ¿Pero a qué cambiarlo? Cuando uso simplemente 'Rscript' por sí mismo,' 'browser()' se activa pero sale del script, sin darme una sesión interactiva. –

Respuesta

20

¿Puede simplemente encender R y obtener el archivo en su lugar?

R 
source("script.R") 
+1

Gracias, pero lo había intentado.Se queja de que faltan los argumentos de la línea de comando y luego sale. –

+0

Entonces, ¿por qué no solo ** primero ** pegar en los argumentos de la línea de comando a una sesión R activa, y ** luego ** fuente en "script.R". Con la adición de este detalle, la sugerencia de @ mdsumner parece bastante sólida. –

+0

O cree dos scripts R, uno que lea los argumentos de la línea del cmd y ordene el segundo. En el primer script, puede establecer una opción global llamada interactiva (usando la función de opciones). En el segundo script puede marcar esta opción (usando getOption, creo) y si es FALSE, proporcione algunos valores predeterminados para las opciones que pasa a través de la línea de comando. De esta forma puede depurar su segundo de forma interactiva y luego ejecutarlo en lote con el primero. –

2

Además de la respuesta anterior, me gustaría crear una función de nivel superior (por ejemplo hacerTarea) que lleva a cabo el análisis que desea realizar en el lote. La función toma las opciones de línea de cmd como entrada. En el script por lotes, el origen del script que contiene esta función y lo llama. De esta forma, puede ejecutar fácilmente la función en modo interactivo y usar, p. navegador().

4

Tras la respuesta de mdsumner, edité mi script como el siguiente:

if(!exists("argv")){ 
    argv=commandArgs(TRUE) 
    if(length(argv)!=4)usage_and_exit() 
    }else{ 
    if(length(argv)!=4){ 
     stop("Must set argv as a 4 element vector. E.g. argv=c(...)") 
     } 
    } 

Entonces se necesitaba ningún otro cambio, y yo era capaz de hacer:

R 
> argv=c('a','b','c','d') 
> source("script.R") 
Cuestiones relacionadas