2017-01-27 2 views
0

Je peux soumettre un heredoc bash directement à qsub comme ceci:Comment qsub un script R comme un heredoc?

my_var="foobar" 
qsub <<HERE 
    #!/bin/bash 
    echo "$my_var" 
HERE 

Et je peux exécuter un script R avec un heredoc bash comme ceci:

my_var="foobar" 
Rscript - "arg1" "arg2" <<E0F 
    ## R code 
    cat("\nR loaded\n") 
    args <- commandArgs(TRUE) 
    cat("Script args are:\n") 
    args 
    print("$my_var") 
    sessionInfo() 
E0F 

Et je peux soumettre un script R sauvé directement à qsub sans un script wrapper bash, comme ceci:

qsub -wd $PWD -o :${PWD}/ -j y -b y Rscript my_script.R "arg_1" "arg_2" 

my_script.R regards comme ceci:

$ cat my_script.R 
#!/usr/bin/env Rscript 
cat("\nR loaded\n") 
args <- commandArgs(TRUE) 
cat("Script args are:\n") 
args 
sessionInfo() 

Cependant, si j'essaie de combiner et de soumettre le script R directement comme heredoc ....

my_var="foobar" 
qsub -wd $PWD -o :${PWD}/ -j y -b y Rscript - "foo" "bar" <<E0F 
#!/usr/bin/env Rscript 
cat("\nR loaded\n") 
args <- commandArgs(TRUE) 
cat("Script args are:\n") 
args 
print("$my_var") 
sessionInfo() 
E0F 

... ça ne fonctionne pas. Je n'ai rien de sortie. Pas de messages d'erreur non plus.

Existe-t-il un moyen de le faire? Également intéressé par la même chose pour Python. Je pensais essayer des heredocs imbriqués, mais le besoin d'indentation littérale ne fonctionnera pas bien puisque mes IDE les remplacent tous automatiquement par des espaces.

Aussi est d'utiliser Sun Grid Engine qsub

+1

Pourquoi? Il suffit d'écrire les bons scripts '#!' Pour '/ usr/bin/Rscript' ou, mon préféré,'/usr/bin/r' dans [littler] (http://dirk.eddelbuettel.com/code/littler. html) (et sur CRAN [ici] (https://cran.r-project.org/package=littler)). Ce dernier fait aussi 'stdin', donc vous pourriez essayer d'y glisser vos heredocs. –

+0

Reproductibilité et documentation. Je veux que mon code R et Python soit intégré au script bash environnant et au bloc-notes Markdown. Quand j'ai plusieurs fichiers de script pour garder une trace des choses deviennent facilement confus et désordonné. – user5359531

+0

"Vouloir seul ne le fait pas." Regardez la source de '/ usr/bin/R', elle est elle-même un script shell. D'où mes allusions à des alternatives ... –

Répondre

0

On dirait que je me trompais sur les exigences de retrait et heredocs imbriqués ne fonctionnent réellement pour cela.

# find files I need to process 
files_I_want="$(find /my/dir/ -type f -name "*.txt")" 
output_dir="/other/dir" 

# iterate over files 
for some_file in $files_I_want; do 
    # set output file path 
    output_file="${output_dir}/$(basename "$some_file")" 

    # submit bash heredoc qsub job 
    qsub -wd $PWD <<E0F 
# R example 
# start R heredoc 
Rscript - "${some_file}" "${output_file}" <<E0F2 
args <- commandArgs(TRUE) 

my_crazy_function <- function(input_file, output_file){ 
    print("input file is:") 
    print(input_file) 
    print("output file is:") 
    print(output_file) 
} 
print("This is R") 
my_crazy_function(input_file = args[1], output_file = args[2]) 

E0F2 

# Python example 
python - "${some_file}" "${output_file}" <<E0F3 
import sys 

def my_crazy_function(input_file, output_file): 
    print "Input file is: ", input_file 
    print "Output file is: ", output_file 

input_file = sys.argv[1] 
output_file = sys.argv[2] 
print "This is Python" 
my_crazy_function(input_file, output_file) 
E0F3 
E0F 

done