我写了一个脚本,当它被调用时会检查脚本是否以交互方式运行,使用 interactive()
进行检查。如果它是以交互方式运行的,则不会搜索命令行参数。然而,如果它不是以交互方式运行,它将搜索命令行参数并抛出错误。
通常情况下这没问题,但有时我会编写第二个 R 脚本,只是为了处理一些数据。所以 Script2 源代码中导入 Script1,而 Script1 检测到它不是以交互方式运行,并开始搜索命令行参数并抛出错误。
除了 interactive()
之外,脚本还能以其他方式检测上下文吗?例如,当直接运行脚本时,我希望有不同的行为与当加载其内部函数访问时。对于包,我可以像这样使用 dplyr :: arrange()
访问 arrange
,而无需加载所有 dplyr。
编辑:我的当前非常拙劣的解决方法是启动一个交互式会话,源代码中导入 Script1,使用 save.image()
来保存函数,然后在 Script2 中使用 load
加载保存的 .RData 文件。但显然这不是...优雅的方法。
我认为我使用的确切代码并不那么重要,但如果有人觉得这对答案很重要,我会包括在内...
精简示例代码:
#!/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
}
if __name__ == '__main__':
这样的东西,对吗? - r2evans