2014-01-27 5 views
5

Я хотел бы, чтобы R-скрипты имели функцию main(), которая выполняется в интерактивном режиме. Но функция main() не должна выполняться при поиске файла.Является ли (interactive()) R эквивалентным pythonic "if __name__ ==" __main__ ": main()"?

There is already a question about this и очень хороший ответ предполагает использование функции interactive(). Однако это не работает для меня. У меня недостаточно очков репутации для комментариев или ответов в этом вопросе. Поэтому я снова задаю этот вопрос.

Я пишу это в script_1.r

if(interactive()){ 
    your main code here 
} 

Если я использую knitr отказаться в HTML или PDF-документ, снабжаем сценарий. Этот код под номером if(interactive()) не будет выполнен. Это хорошо для меня, вот чего я хочу.

Моя проблема заключается в том, что если я source("script_1.r") от script_2.r в интерактивном режиме, он все равно будет запускать код под этой частью if(interactive()).

+0

Чтобы быть ясным, вы хотите, чтобы интерактивный бит выполнялся при использовании knitr, но не при непосредственном источнике сценария? –

+0

Нет. Я не хочу, чтобы бит if (interactive()) выполнялся вообще. Ни при запуске knitr, ни при поиске из другого скрипта. –

+0

На самом деле я нашел проще, я поместил свой код в раздел if (FALSE) {}, и он вообще не выполняется. Большую часть времени это то, что я хочу. –

ответ

4

Лучший способ получить вид управления, который вы ищете, - это использовать параметры.

Например, «script.r» будет выглядеть следующим образом:

main <- function() { 
    message('main!') 
} 

if (getOption('run.main', default=TRUE)) { 
    main() 
} 

Если вы поиск файла в интерактивном режиме и не хотите main выполнить, просто вызовите options(run.main=FALSE) перед вызовом source. Если вы используете скрипт с knitr, и вы хотите выполнить main, не устанавливайте эту опцию, и по умолчанию она будет равна TRUE. Или, если вы не хотите, чтобы главный работал с knitr, позвоните по номеру options(run.main=FALSE), прежде чем позвонить ему.

+0

Спасибо, Мэтью, я не знал, что ты сможешь настроить варианты таким образом. Он делает то, что я хочу. –

+0

Я установил опцию FALSE, прежде чем подбирать скрипт и снова вернул его в TRUE. (run.load.main = FALSE) источник («код/​​load.r») опции (run.load.main = TRUE) –

1

Как вы заметили, нет, это не одно и то же. if(interactive()) выполняет именно то, что говорит имя, - он проверяет, выполняется ли код в интерактивной оболочке. Не больше, не меньше.

Нет прямого эквивалента if __name__ == '__main__' из Python в R, так как R не имеет понятия модулей так же, как Python, и код source 'только что исполнен.

Вы можете написать собственную команду source, чтобы заменить установленную по умолчанию и выполнить необходимую проверку.

Таким образом, вопрос, который вы связали, делаетcontain an answer which presents a workaround и по существу повторяет функциональность Python. Однако это не похоже на то, что вы хотите, поскольку оно не будет работать так, как вы ожидаете, когда его привлечет Ниттер.

+0

Спасибо, if (interactive()) делает то, что я хочу, когда вызывается Knitr, но не при вызове другого скрипта в интерактивном режиме. Может быть, последняя часть моего вопроса была непонятна. –

+0

@ Paul4forest Нет, было ясно. Но, как я уже сказал, для этого нет готового решения. –

+0

Поскольку я задал этот вопрос, я [научился помещать свой код в пакеты R] (http://r-pkgs.had.co.nz/).Потребность в исходных файлах в основном исчезла. Вместо этого я создаю и загружаю свой пакет. –

Смежные вопросы