Как qsub R-скрипт как heredoc?

Я могу отправить документ bash прямо в qsub следующим образом:

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

И я могу запустить R-скрипт с вот таким вот документом bash:

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

И я могу отправить сохраненный скрипт R напрямую в qsub без скрипта-оболочки bash, например:

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

где my_script.R выглядит так:

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

Однако, если я попытаюсь объединить это и отправить сценарий R напрямую в виде 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

... это не работает. У меня ничего не выходит. Сообщений об ошибках тоже нет.

Есть ли способ сделать это? Также интересует то же самое для Python. Я подумывал о том, чтобы попробовать вложенные heredocs, но потребность в буквальном отступе \t не будет работать, поскольку все мои IDE автоматически заменяют их пробелами.

Также используется Sun Grid Engine qsub


person user5359531    schedule 27.01.2017    source источник
comment
Почему? Просто напишите соответствующие #! сценарии либо для /usr/bin/Rscript, либо для моего любимого /usr/bin/r из littler (и в CRAN здесь). Этот последний также делает stdin, так что вы можете попытаться втиснуть в него свои документы.   -  person Dirk Eddelbuettel    schedule 27.01.2017
comment
Воспроизводимость и документация. Я хочу, чтобы мой код R и Python был встроен в окружающий скрипт bash и блокнот Markdown. Когда у меня есть несколько файлов сценариев для отслеживания, все становится запутанным и беспорядочным.   -  person user5359531    schedule 27.01.2017
comment
Желание само по себе не делает его таковым. Посмотрите на источник /usr/bin/R, это сам сценарий оболочки. Отсюда и мои намеки на альтернативы...   -  person Dirk Eddelbuettel    schedule 27.01.2017
comment
Не работает. Я думаю, проблема в том, как qsub обрабатывает стандартный ввод в двоичном режиме.   -  person user5359531    schedule 27.01.2017


Ответы (1)


Похоже, я ошибся в требованиях к отступам, и вложенные хередокументы действительно работают для этого.

# 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
person user5359531    schedule 27.01.2017