2

我很高兴发现 Jeff 和 Dirk 的应用程序更小,可以从终端运行 R 函数。¡ 赞!
从那时起,我已经能够将我的功能传递给我的开发团队并让它们在其他服务器上运行。

我的问题是关于它的部署。在将它传递给其他人之前,我会在我的计算机上试用它并使用 RStudio 准备它......(也是荣誉)。
我想知道脚本中是否有要运行的命令,我可以在该命令上判断该函数是从命令运行还是使用 R 执行。

谢谢。

4

2 回答 2

3

不知道有没有更具体的答案。但总的来说,在 R 中不可能(或非常难)确定代码是如何运行的,这是我在modules上工作的动机之一。

R 唯一知道的是代码是否在交互式 shell 中运行(通过interactive())。

使用模块,您可以测试是否module_name()已设置,类似于 Python 的__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.
}

我已经基于此编写了一个小型包装器,我用它来编写我的命令行应用程序。例如,一个非常简单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))
})
于 2015-02-18T17:02:32.520 回答
2

我不确定我是否理解你的问题。你的意思是像

edd@max:~$ which r
/usr/local/bin/r
edd@max:~$ 

您可以将结果which与空字符串进行比较,因为当您请求一个不存在的程序时没有任何返回。

edd@max:~$ which s      # we know we don't have this
edd@max:~$ 

然后,您可以使用 的结果which r来检查版本:

edd@max:~$ `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.

edd@max:~$ 

编辑:当您似乎对interactive()真假感到困惑时,请考虑r --help

edd@max:~$ 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'


edd@max:~$ 

edd@max:~$ r -e'print(interactive())'
[1] FALSE
edd@max:~$ r -i -e'print(interactive())'
[1] TRUE
edd@max:~$ 

但这是设置它而不是查询它。

于 2015-02-18T17:00:31.490 回答