little 确定 运行 是否已部署

littler determine if running as deployed

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

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

谢谢。

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

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:~$ 

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

不知道有没有更具体的回答。但总的来说,在 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.
}

我已经基于此编写了一个 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))
})