Подтвердить что ты не робот

Существует ли R-эквивалент пифонического "if __name__ ==" __main__ ": main()??

Цель состоит в том, чтобы иметь два простых способа исправить некоторый код, например func.R, содержащий функцию. Вызов R CMD BATCH func.R инициализирует функцию и оценивает ее. В течение сеанса выдача source("func.R") просто инициализирует функцию. Любая идея?

4b9b3361

Ответ 1

Я думаю, что функция interactive() может работать.

Эта функция возвращает TRUE, когда R используется в интерактивном режиме и FALSE в противном случае. Поэтому просто используйте if (interactive())

то есть. эквивалент

if (!interactive()) {
  main()
}

Ответ 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
}