R脚本作为一个函数

时间:2017-01-18 21:08:27

标签: r function

我有一个涉及数据操作和估算的长脚本。我有设置使用一组参数,虽然我希望能够使用不同的输入类型多次运行此脚本,就像一个函数。

运行脚本会生成绘图并将估计保存到csv,我并不特别关注它创建的对象。

我宁愿不将脚本包装在一个函数中,因为它是交互式使用的。 人们如何做这样的事情?

我发现这是命令行参数:How to pass command-line arguments when source() an R file但仍然无法解决交互式问题

3 个答案:

答案 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"