Eu tenho um script R para o qual gostaria de poder fornecer vários parâmetros de linha de comando (em vez de valores de parâmetro de código fixo no próprio código). O script é executado no Windows.
Não consigo encontrar informações sobre como ler os parâmetros fornecidos na linha de comando no meu script R. Eu ficaria surpreso se isso não puder ser feito, então talvez eu não esteja usando as melhores palavras-chave na minha pesquisa no Google ...
Alguma indicação ou recomendação?
command-line
r
parameters
monch1962
fonte
fonte
Respostas:
A resposta de Dirk aqui é tudo que você precisa. Aqui está um exemplo mínimo reproduzível.
Eu criei dois arquivos:
exmpl.bat
eexmpl.R
.exmpl.bat
:Como alternativa, usando
Rterm.exe
:exmpl.R
:Salve os dois arquivos no mesmo diretório e inicie
exmpl.bat
. No resultado, você obterá:example.png
com algum enredoexmpl.batch
com tudo o que foi feitoVocê também pode adicionar uma variável de ambiente
%R_Script%
:e use-o em seus scripts em lote como
%R_Script% <filename.r> <arguments>
Diferenças entre
RScript
eRterm
:Rscript
possui sintaxe mais simplesRscript
escolhe automaticamente a arquitetura em x64 (consulte R Instalação e administração, 2.6 Subarquiteturas para obter detalhes)Rscript
precisaoptions(echo=TRUE)
no arquivo .R se você deseja gravar os comandos no arquivo de saídafonte
Alguns pontos:
Os parâmetros da linha de comando são acessíveis via
commandArgs()
, portanto, vejahelp(commandArgs)
uma visão geral.Você pode usar
Rscript.exe
em todas as plataformas, incluindo Windows. Vai apoiarcommandArgs()
. littler poderia ser portado para o Windows, mas agora vive apenas no OS X e Linux.Existem dois pacotes complementares no CRAN - getopt e optparse - que foram escritos para análise de linha de comando.
Editar em novembro de 2015: Novas alternativas apareceram e eu recomendo sinceramente o docopt .
fonte
Adicione isso ao topo do seu script:
Em seguida, você pode consultar os argumentos passados como
args[1]
,args[2]
etc.Então corra
Se seus argumentos forem cadeias de caracteres com espaços, coloque-as entre aspas duplas.
fonte
Experimente a biblioteca (getopt) ... se você quiser que as coisas sejam melhores. Por exemplo:
fonte
você precisa Littler (pronuncia-se 'pouco r')
Dirk estará daqui a 15 minutos para elaborar;)
fonte
Como
optparse
já foi mencionado algumas vezes nas respostas e fornece um kit abrangente para processamento de linha de comando, aqui está um pequeno exemplo simplificado de como você pode usá-lo, supondo que o arquivo de entrada exista:script.R:
Dado um arquivo arbitrário
blah.txt
com 23 linhas.Na linha de comando:
Rscript script.R -h
saídasRscript script.R -n blah.txt
saídas[1] "69"
Rscript script.R -n -f 5 blah.txt
saídas[1] "115"
fonte
No bash, você pode construir uma linha de comando como a seguinte:
Você pode ver que a variável
$z
é substituída pelo bash shell com "10" e esse valor é captadocommandArgs
e alimentadoargs[2]
, e o comando rangex=1:10
executado por R com sucesso, etc.fonte
FYI: existe uma função args (), que recupera os argumentos das funções R, que não deve ser confundida com um vetor de argumentos chamado args
fonte
Se você precisar especificar opções com sinalizadores, (como -h, --help, --number = 42, etc), poderá usar o pacote optparse do R (inspirado no Python): http://cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf .
Pelo menos é assim que eu entendo sua pergunta, porque encontrei este post ao procurar um equivalente do bash getopt, ou perl Getopt, ou python argparse e optparse.
fonte
Acabei de montar uma boa estrutura de dados e uma cadeia de processamento para gerar esse comportamento de comutação, sem necessidade de bibliotecas. Tenho certeza de que ele já foi implementado várias vezes e me deparei com esse tópico procurando exemplos - pensei em entrar.
Nem sequer precisei de sinalizadores (o único sinalizador aqui é um modo de depuração, criando uma variável que eu verifico como condição para iniciar uma função a jusante
if (!exists(debug.mode)) {...} else {print(variables)})
. Aslapply
instruções de verificação do sinalizador abaixo produzem o mesmo:onde
args
é a variável lida nos argumentos da linha de comando (um vetor de caractere, equivalente ac('--debug','--help')
quando você os fornece, por exemplo)É reutilizável para qualquer outro sinalizador e você evita toda a repetição, sem bibliotecas e sem dependências:
Observe que
flag.details
aqui os comandos são armazenados como seqüências de caracteres e avaliados comeval(parse(text = '...'))
. O Optparse é obviamente desejável para qualquer script sério, mas o código de funcionalidade mínima também é bom às vezes.Saída de amostra:
fonte