2015-02-18 5 views
2

Я очень рад, что нашел приложение Джеффа и Дирка littler для запуска функций R из терминала. ¡Престижность!
С тех пор я смог передать свои функции моей команде разработчиков и запустить их на других серверах.littler определяет, работает ли как развернутый

Мой вопрос о его развертывании. Прежде чем передавать его другим, я попробую его на своем компьютере и подготовлю его к RStudio ... (также и престижно).
Мне было интересно, есть ли команда для запуска в скрипте, на котором я могу узнать, запущена ли функция из команды или если она выполнена с R.

Спасибо.

ответ

3

Я не знаю, есть ли конкретный ответ. Но в целом это невозможно (или очень сложно) в R, чтобы определить, как выполняется код, что было одной из мотивов моей работы на modules.

Единственное, что знает R, это то, выполняется ли код в интерактивной оболочке (через interactive()).

С модулями, вы можете проверить, является ли module_name() набором, аналогичный Питон __name__:

if (is.null(module_name()) && ! interactive()) { 
    # Stand-alone, execute main entry point 
} 

if (! is.null(module_name())) { 
    # Code is being loaded as a module. 
} 

Я написал small wrapper на этой основе, который я использую, чтобы писать свои приложения из командной строки. Например, очень простой cat -как приложение будет выглядеть следующим образом:

#!/usr/bin/env Rscript 

sys = modules::import('sys') 

sys$run({ 
    if (length(sys$args) == 0) { 
     message('Usage: ', script_name(), ' filename') 
     sys$exit(1) 
    } 

    input = sys$args[1] 
    cat(readLines(input)) 
}) 
+0

Я ожидаю, что 'interactive' делает то, что мне нужно. Мне нужно некоторое время, чтобы посмотреть на ваши «модули». – Diego

+1

@ Diego Да, этого может быть достаточно. Проблема, с которой 'interactive()' имеет и какие модули решает, заключается в том, что она также будет «TRUE» для кода библиотеки, который вы загружаете в своем интерактивном сеансе. Это раздражает, когда вы хотите повторно использовать части своего кода, но * также * иметь этот код независимо от исполняемого файла. Это довольно распространенный шаблон в пакетах Python, который я нашел полезным и в R. –

2

Я не уверен, что понял ваш вопрос. Вы имеете в виду что-то вроде

[email protected]:~$ which r 
/usr/local/bin/r 
[email protected]:~$ 

Вы можете сравнить результат which с пустой строкой в ​​качестве ничего не возвращается, когда вы просите несуществующей программы.

[email protected]:~$ which s  # we know we don't have this 
[email protected]:~$ 

Вы можете использовать результат which r для проверки, скажем, версия:

[email protected]:~$ `which r` --version 
r ('littler') version 0.2.2 

git revision 8df31e5 as of Thu Jan 29 17:43:21 2015 -0800 
built at 19:48:17 on Jan 29 2015 
using GNU R Version 3.1.2 (2014-10-31) 

Copyright (C) 2006 - 2014 Jeffrey Horner and Dirk Eddelbuettel 

r is free software and comes with ABSOLUTELY NO WARRANTY. 
You are welcome to redistribute it under the terms of the 
GNU General Public License. For more information about 
these matters, see http://www.gnu.org/copyleft/gpl.html. 

[email protected]:~$ 

Edit: Как вы, кажется, путают о interactive() истинным или ложным, считают r --help:

[email protected]:~$ r --help 

Usage: r [options] [-|file] 

Launch GNU R to execute the R commands supplied in the specified file, or 
from stdin if '-' is used. Suitable for so-called shebang '#!/'-line scripts. 

Options: 
    -h, --help   Give this help list 
     --usage   Give a short usage message 
    -V, --version  Show the version number 
    -v, --vanilla  Pass the '--vanilla' option to R 
    -t, --rtemp   Use per-session temporary directory as R does 
    -i, --interactive Let interactive() return 'true' rather than 'false' 
    -q, --quick   Skip autoload/delayed assign of default libraries 
    -p, --verbose  Print the value of expressions to the console 
    -l, --packages list Load the R packages from the comma-separated 'list' 
    -d, --datastdin  Prepend command to load 'X' as csv from stdin 
    -e, --eval expr  Let R evaluate 'expr' 


[email protected]:~$ 

и

[email protected]:~$ r -e'print(interactive())' 
[1] FALSE 
[email protected]:~$ r -i -e'print(interactive())' 
[1] TRUE 
[email protected]:~$ 

но это установка это, в отличие от запроса.

+0

То, что я хотел спросить ближе к @ ответ Конрада выше. Похоже, что «интерактивный» делает трюк. – Diego