【发布时间】:2018-06-04 13:27:42
【问题描述】:
我编写了一个脚本,当它被获取时,它会检查脚本是否正在使用interactive() 以交互方式运行。如果它以交互方式运行,它不会搜索命令行参数。但是,如果它不是以交互方式运行,它会搜索命令行参数并引发错误。
这通常很好,但有时我会编写第二个 R 脚本,我想独立运行它来处理一些数据。因此 Script2 获取 Script1,而 Script1 检测到它没有以交互方式运行,并开始搜索命令行参数并引发错误。
除了interactive() 之外还有什么方法可以让脚本检测其上下文吗?例如,当它直接运行时与加载它以访问其内部功能之一时,我想要单独的行为。使用软件包,我可以执行类似dplyr::arrange() 的操作来访问arrange,而无需加载所有dplyr。
编辑:我目前非常麻烦的解决方法是启动交互式会话,源 Script1,使用 save.image() 保存函数,然后在 Script2 中使用 load 加载保存的 . R 数据文件。但这显然不是……优雅。
我不认为我使用的确切代码是相关的,但包括它以防有人认为这对答案很重要......
精简示例代码:
#!/usr/bin/env Rscript
library(optparse)
function1 <- function(etc,etc) {}
function2 <- function(etc,etc) {}
if(!interactive()) {
# example call
# Rscript create_reference_file.R -c cd4cd8 -o /home/outputfolder/
option_list = list(
make_option(c('-c', '--cell'), type = 'character', default = NULL,
help = 'the name of the cell',
metavar = 'character'),
make_option(c('-o','--outdir'), type = 'character', default = NULL,
help = 'the location where you wish to store your output',
metavar = 'character'),
)
opt_parser <- OptionParser(option_list = option_list)
opt <- parse_args(opt_parser)
function1(opt); function2(opt) # etc etc, I do stuff with the opt inputs
}
【问题讨论】:
-
您正在寻找类似于 python 的
if __name__ == '__main__':的东西,对吧? -
(如果你不会说 python,这里有一些关于该参考的背景:stackoverflow.com/questions/419163/what-does-if-name-main-do)
-
是的!这基本上与我正在寻找的功能相同(或可以实现类似结果的功能)。