Saia do código ao chamar o script R do bash
Eu tenho um script R que chamo de um shell bash interativo (MacOS Catalina). Este é um de uma série de scripts que chamo do shell interativo, portanto, preciso saber se o script inicial falhou. Parece que não importa como o script falhe (assert_that, stop, stopfinot, quit), R sempre retorna um status de saída de 0. Como posso retornar um status exist diferente de zero de um script R com falha?
Aqui está um exemplo de script R (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")
E aqui está como eu poderia chamá-lo de um prompt bash
src/poc/fail.r
echo $?
Independentemente do método que utilizo para sair do script R $? sempre retorna 0.
Algumas outras postagens abordam esse problema, mas não parecem se aplicar à minha situação ( Como fazer um Rscript retornar um código de status no modo bash não interativo ) e ( Fazer R sair com código de status diferente de zero )
Respostas
Posso obter o status de Rscript de volta ao shell de chamada (R versão 4.0.2, bash versão 3.2.57 ou zsh versão 5.8 em execução em um MacBook Pro, macOS Mohave 10.14.6) usando q(status = N). Para obter um status de saída diferente de zero de um script R com falha, use q(status = 2)ou 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 um script essencialmente idêntico ao que você postou, obtenho os resultados esperados (o status de quité passado com sucesso para o shell anexo):
Roteiro:
#!/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")
Saída (testado com as versões zsh e bash mostradas acima):
$ ~/test/test1.r Starting script $ echo $? 0 $ ~/test/test1.r
Starting script
$ echo $?
2
$ ~/test/test1.r Starting script $ echo $?
10
VEJA TAMBÉM:
Alguns valores de status de erro são usados pelo próprio R. O manipulador de erros padrão para uso não interativo efetivamente chama q ("não", 1, FALSO) e retorna o status de erro 1. O status de erro 2 é usado para R 'suicídio', que é uma falha catastrófica, e outros números pequenos são usados por portas específicas para falhas de inicialização. Recomenda-se que os usuários escolham status de 10 ou mais.
Os valores válidos de status dependem do sistema, mas 0: 255 normalmente são válidos.
(De quitdocumentos)