我有一个涉及数据操作和估算的长脚本。我有设置使用一组参数,虽然我希望能够使用不同的输入类型多次运行此脚本,就像一个函数。
运行脚本会生成绘图并将估计保存到csv,我并不特别关注它创建的对象。
我宁愿不将脚本包装在一个函数中,因为它是交互式使用的。 人们如何做这样的事情?
我发现这是命令行参数:How to pass command-line arguments when source() an R file但仍然无法解决交互式问题
答案 0 :(得分:0)
list2env
将变量推送到全局或函数的本地环境
然后我source
指定环境中的功能。
这可能非常有用,尤其是与exists
结合使用时,如下例所示,这样可以让您的脚本保持独立状态。
这两个问题也可能有所帮助: Source-ing an .R script within a function and passing a variable through (RODBC) How to pass command-line arguments when source() an R file
# Function ----------------------------------------------------------------
subroutine <- function(file, param = list(), local = TRUE, ...) {
list2env(param, envir = if (local) environment() else globalenv())
source(file, local = local, ...)
}
# Example -----------------------------------------------------------------
# Create an example script
tmp <- "test_subroutine.R"
cat("if (!exists('msg')) msg <- 'no argument provided'; print(msg)", file = tmp)
# Example of using exists in the script to keep it stand-alone
subroutine(tmp)
# Evaluate in functions environment
subroutine(tmp, list(msg = "use function's environment"), local = TRUE)
exists("msg", envir = globalenv()) # FALSE
# Evaluate in global environment
subroutine(tmp, list(msg = "use global environment"), local = FALSE)
exists("msg", envir = globalenv()) # TRUE
unlink(tmp)
答案 1 :(得分:0)
为了澄清 Hansi 评论中提到的内容,这里是解决此问题的一种方法:
将脚本包装到一个函数中,因为这会让您在需要时提升一个抽象级别,并且还可以在任何其他脚本中需要时更轻松地调用该函数。
如果您想以交互方式使用脚本,您可以在脚本中的某处放置一个 browser()
调用。在调用 browser()
时,该函数将暂停并保持函数内的环境原样,然后您可以逐步执行该函数并在该函数内以交互方式使用 R。
答案 2 :(得分:-1)
在基础包中,检查?commandArgs
,您可以使用它来解析命令行中的参数。
如果我有一个脚本test.R,其中包含代码:
args <- commandArgs(trailingOnly=TRUE)
for (arg in args){
print(arg)
}
我从命令行用rscript
调用它,如下所示:
rscript test.R arg1 arg2 arg3
输出结果为:
[1] "arg1"
[1] "arg2"
[1] "arg3"