Цель состоит в том, чтобы иметь два простых способа исправить некоторый код, например func.R, содержащий функцию. Вызов R CMD BATCH func.R
инициализирует функцию и оценивает ее. В течение сеанса выдача source("func.R")
просто инициализирует функцию.
Любая идея?
Существует ли R-эквивалент пифонического "if __name__ ==" __main__ ": main()??
Ответ 1
Я думаю, что функция interactive()
может работать.
Эта функция возвращает TRUE
, когда R используется в интерактивном режиме и FALSE
в противном случае. Поэтому просто используйте if (interactive())
то есть. эквивалент
if (!interactive()) {
main()
}
Ответ 2
Вы можете передать аргументы в R, и если присутствует аргумент run main(). Подробнее о аргументах здесь: http://yangfeng.wordpress.com/2009/09/03/including-arguments-in-r-cmd-batch-mode/
Ответ 3
Это много работы, но я, наконец, получил ее (и опубликовал в Rosetta Code).
В этом примере экспортируется функция с именем meaningOfLife
. Когда script запускается сам по себе, он запускает main
. При импорте другим R файлом он не запускается main
.
#!/usr/bin/Rscript
meaningOfLife <- function() {
42
}
main <- function(program, args) {
cat("Main: The meaning of life is", meaningOfLife(), "\n")
}
getProgram <- function(args) {
sub("--file=", "", args[grep("--file=", args)])
}
args <- commandArgs(trailingOnly = FALSE)
program <- getProgram(args)
if (length(program) > 0 && length(grep("scriptedmain", program)) > 0) {
main(program, args)
q("no")
}
Ответ 4
Я задал аналогичный вопрос в ответе, предположил Мэтью Пурдэ, используя getOption('run.main', default=TRUE)
в главном script, а затем установив options(run.main=FALSE)
перед вызовом source()
. Это работало в моем случае.
В противном случае более простой шаблон, когда у вас есть R script, создающий кучу функций, и вы хотите написать несколько строк в конце script, чтобы поэкспериментировать с использованием функции: поместите эти дополнительные строки в if(FALSE){}
.
Ответ 5
Другой вариант:
#!/usr/bin/Rscript
# runs only when script is run by itself
if (sys.nframe() == 0){
# ... do main stuff
}