Salir del código al llamar al script R desde bash

Sep 15 2020

Tengo una secuencia de comandos R que llamo desde un shell bash interactivo (MacOS Catalina). Este es uno de una serie de scripts que llamo desde el shell interactivo, así que necesito saber si el script inicial falló. Parece que no importa cómo falle el script (assert_that, stop, stopfinot, quit), R siempre devuelve un estado de salida de 0. ¿Cómo puedo devolver un estado de existencia distinto de cero desde un script R fallido?

A continuación, se muestra un script de R de ejemplo (fail.r).

#!/usr/bin/env Rscript

#library(assertthat)

message("Starting script")

#assert_that(FALSE)

#stop('Fail')

#stopifnot(FALSE)

q(save="no", status=10, runLast=FALSE)

message("Should not reach here")

Y así es como podría llamarlo desde un indicador de bash

src/poc/fail.r

echo $?

Independientemente del método que utilice para salir del script R $? siempre devuelve 0.

Un par de otras publicaciones abordan este problema, pero no parecen aplicarse a mi situación ( Cómo hacer que un Rscript devuelva un código de estado en modo bash no interactivo ) y ( Hacer que R salga con un código de estado distinto de cero )

Respuestas

1 TimurShtatland Sep 14 2020 at 23:36

Puedo obtener el estado de Rscript de nuevo al shell de llamada (versión R 4.0.2, versión bash 3.2.57 o zsh versión 5.8 ejecutándose en una MacBook Pro, macOS Mohave 10.14.6) usando q(status = N). Para obtener un estado de salida distinto de cero de un script R fallido, use q(status = 2)o superior, consulte quit:

$ Rscript -e 'q(status = 0);' $ echo $? 0 $ Rscript -e 'q(status = 2);'
$ echo $?
2

$ Rscript -e 'q(status = 10);' $ echo $? 10 $ R --version
R version 4.0.2 (2020-06-22) -- "Taking Off Again"
Copyright (C) 2020 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin13.4.0 (64-bit)

$ bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18) $ zsh --version
zsh 5.8 (x86_64-apple-darwin17.7.0)

Usando un script esencialmente idéntico al que publicaste, obtengo los resultados esperados (el estado de quitse pasa con éxito al shell adjunto):

Guión:

#!/usr/bin/env Rscript

message("Starting script")
## Use status = 0, 2 or 10:
q(save = "no", status = 2, runLast = FALSE)
message("Should not reach here")

Resultado (probado con las versiones zsh y bash que se muestran arriba):

$ ~/test/test1.r Starting script $ echo $? 0 $ ~/test/test1.r
Starting script
$ echo $?       
2
$ ~/test/test1.r Starting script $ echo $?       
10

VER TAMBIÉN:

Algunos valores de estado de error son utilizados por R mismo. El controlador de errores predeterminado para uso no interactivo llama efectivamente a q ("no", 1, FALSE) y devuelve el estado de error 1. El estado de error 2 se usa para R 'suicidio', que es una falla catastrófica, y se usan otros números pequeños por puertos específicos para fallas de inicialización. Se recomienda que los usuarios elijan estados de 10 o más.

Los valores válidos de estado dependen del sistema, pero 0: 255 son normalmente válidos.

(De los quitdocumentos)