É muito conveniente ter scripts R para fazer plotagens simples na linha de comando. No entanto, executar R a partir de scripts bash não é nada conveniente. O ideal pode ser algo como
#!/path/to/R
...
ou
#!/usr/bin/env R
...
mas não fui capaz de fazer nenhum desses funcionar.
Outra opção é manter os scripts puramente em R, por exemplo script.R
, e invocá-los com R --file=script.R
ou semelhante. No entanto, ocasionalmente, um script dependerá de opções de linha de comando obscuras em que parte do código existe fora do script. Exemplo: inserir coisas em R do bash por meio de um .Rprofile local, as opções desejadas são, então, tudo --vanilla
indica, exceto --no-init-file
.
Outra opção é um script bash para armazenar os sinalizadores R e ser executável sem dor, que então chama o script R. O problema é que isso significa que um único programa acabou de ser dividido em dois arquivos que agora devem ser mantidos em sincronia, transferidos para novas máquinas juntos, etc.
A opção que eu menos desprezo atualmente é incorporar o R em um script bash:
#!/bin/bash
... # usage message to catch bad input without invoking R
... # any bash pre-processing of input
... # etc
R --random-flags <<RSCRIPT
# R code goes here
RSCRIPT
Tudo está em um único arquivo. É executável e lida facilmente com argumentos. O problema é que combinar bash e R dessa forma elimina praticamente a possibilidade de qualquer IDE não falhar em um ou no outro e faz meu coração doer muito.
Existe alguma maneira melhor que estou perdendo?
Rscript --help
da linha de comando listará muitas opções úteis que podem ser adicionadas ao shebang, como--vanilla
.commandArgs
função e os pacotesgetopt
eoptparse
para analisar a linha de comando. Para que argumentos e opções também possam ser passados para seus scripts ao executar a partir da linha de comando.#!/usr/bin/Rscript
(o que não é a prática padrão para scripts R).Experimente um pouco mais .
littler
fornece capacidade hash-bang (ou seja, script começando com #! / algum / caminho) para GNU R, bem como linha de comando simples e uso de tubulação.fonte
A resposta de Miguel Sanchez é como deveria ser. A outra maneira de executar o Rscript poderia ser o comando 'env' para executar o RScript de todo o sistema.
fonte
env
permitiria que você execute o primeiroRscript
encontrado por conta própria$PATH
, permitindo, assim, executar algo diferente de todo o sistema / padrãoRscript
(que pode não estar instalado/usr/whatever
). Eu recomendaria usarenv
paraR
eRscript
outras coisas, uma vez que estes, em particular, podem não ser instalados em locais padrão. (bash
Scripts comuns, no entanto, podem sempre usar com segurança#!/bin/bash
.)/bin/sh
. Todo o resto deve usarenv
lookup. Em particular, na maioria das vezes, o Bash está desatualizado em clusters de computação e os usuários têm suas próprias instalações personalizadas (geralmente em~/.local/bin
, ou compartilhadas em algo como uma/software
montagem NFS). Da mesma forma, no macOS,/bin/bash
está sempre desatualizado devido a problemas de licenciamento, e um Bash atualizado é mais comumente localizado em/usr/local/bin/bash
(sei que seu comentário tem 3 anos, mas isso é bastante importante)./bin/sh
, em qualquer circunstância, também não é "perigoso", então você tem que admitir que o mesmo pode ser dito/bin/bash
. O usoenv
é mais imprevisível, devido àsPATH
configurações confiáveis / inconsistentes para diferentes usuários, mas cada usuário R pode realmente querer esse comportamento, enquanto osbash
scripts não. Por último, para CI / nuvem que invoca scripts bash mais recentes, simplesmente invoque-os usando/path/to/my/bash myscript
ou defina explicitamente o caminho e invoque-os usandoenv script
. EOT#!/path/to/R
não funcionará porque o próprio R é um script, portanto,execve
é infeliz.eu uso
R --slave -f script
fonte
Rscript
(elittler
), caso você esteja se perguntando.Se você estiver interessado em analisar argumentos de linha de comando para um script R, tente RScript que vem junto com R a partir da versão 2.5.x
http://stat.ethz.ch/R-manual/R-patched/library/utils/html/Rscript.html
fonte
Isso funciona,
mas não sei o que acontece se você tiver mais de 1 versão do R instalada em sua máquina.
Se você fizer assim
diz ao intérprete para usar apenas o que R aparecer primeiro em seu caminho.
fonte
Se o programa que você está usando para executar seu script precisa de parâmetros, você pode colocá-los no final de #! linha:
Não sabendo R, não consigo testar corretamente, mas isso parece funcionar:
fonte
Apenas uma nota para adicionar a este post. Versões posteriores de
R
parecem ter se enterradoRscript
um pouco. Para R 3.1.2-1 no OSX baixado em janeiro de 2015, encontreiRscript
emPortanto, em vez de algo como
#! /sw/bin/Rscript
, eu precisava usar o seguinte no início do meu script.Isso
locate Rscript
pode ser útil para você.fonte
#!/usr/bin/env Rscript
vez de um caminho codificado emR
scripts (e adicionar esse caminho longo ao seu$PATH
)Você pode querer usar o módulo rpy2 do python. No entanto, a maneira "certa" de fazer isso é com R CMD BATCH. Você pode modificar isso para gravar em STDOUT, mas o padrão é gravar em um arquivo .Rout. Veja o exemplo abaixo:
Nota: você vai querer experimentar o --vanilla e outras opções para remover todos os problemas de inicialização.
fonte
Experimente smallR para escrever scripts R rápidos na linha de comando:
http://code.google.com/p/simple-r/
(
r
comando no diretório)A plotagem a partir da linha de comando usando smallR ficaria assim:
fonte
littler
certamente seria o preferido (já que ainda está vivo); ou, apenas useRscript
(que realmente saiu depois delittler
ser criado.)O seguinte funciona para mim usando o MSYS bash no Windows - não tenho R na minha máquina Linux, então não posso tentar lá. Você precisa de dois arquivos - o primeiro, chamado runr, executa R com um parâmetro de arquivo
Você precisa tornar este executável com chmod + x runr .
Em seguida, em seu arquivo de script:
Note o #! A linha runr pode precisar incluir o caminho completo para runr, dependendo de como você está usando o comando, como sua variável PATH está definida, etc.
Não é bonito, mas parece funcionar!
fonte