多次重复 R 脚本

Repeat R script multiple times

我有一个包含数百行的 R 脚本。这个脚本最终在最后给了我一个单一的数字答案。现在我想创建一个置信区间,因此 运行 整个脚本一遍又一遍地计算平均值和标准差。但是我不想在整个事情上创建一个 'for' 循环,因为这变得非常复杂

经过一番研究,我发现了这个方法:

我的最终答案被命名为 'result' 然后在一个新的脚本文件中,

result_list<-lapply(1:10, function(n)source("my_script_file.R"))
result_list

(以重复10次为例)

然而最后的结果是这样的,

[[1]]
[[1]]$value
[1] 136.9876

[[1]]$visible
[1] TRUE

[[2]]
[[2]]$value
[1] 138.4969

[[2]]$visible
[1] TRUE

[[3]]
[[3]]$value
[1] 0.2356484

[[3]]$visible
[1] TRUE

. 
.

现在我不知道第二行在每次迭代中意味着什么?我如何获得值列表,result_list$values 不起作用,同时也忽略了可能是模拟错误的太小值,就像这里的第 3 个一样能够计算平均值和 sd。

请问除了这个方法还有其他方法可以重复这个过程吗?

我们可以使用$value从每次迭代中得到'value'

 lapply(1:10, function(n)source("my_script_file.R")$value)

因为它是单个元素,所以使用 sapply 获得 vector 输出可能也很有用

 v1 <- sapply(1:10, function(n)source("my_script_file.R")$value)

我们可以将 vector 的值设为大于特定阈值的子集,例如 0.5,

 v1[v1 > 0.5] 

我建议将您的脚本作为一个函数,加载函数一次,然后使用 replicate 而不是 lapply(1:n, ...)

这是一个非常简单的例子:

假设您正在使用一个包含以下内容的简单 R 脚本文件:

## saved in working directory as "testfun.R"
myFun <- function(x, y, z) {
  mean(rnorm(x)) + mean(rnorm(y)) + mean(rnorm(z))
}

myFun(10, 12, 14)
## End of "testfun.R" file

现在,比较必须 source 100 次与必须 运行 函数 100 次的时间:

fun1 <- function(n = 10) replicate(n, myFun(10, 12, 14))
fun2 <- function(n = 10) lapply(1:n, function(x) source("testfun.R")$value)

library(microbenchmark)
microbenchmark(fun1(100), fun2(100), unlist(fun2(100)), times = 1)
## Unit: milliseconds
##               expr       min        lq      mean    median        uq       max neval
##          fun1(100)  3.064384  3.064384  3.064384  3.064384  3.064384  3.064384     1
##          fun2(100) 59.635228 59.635228 59.635228 59.635228 59.635228 59.635228     1
##  unlist(fun2(100)) 61.349713 61.349713 61.349713 61.349713 61.349713 61.349713     1

如果更多的时间花在处理上(而不是读取源文件),我不确定在长 运行 中会有多大的不同,但我仍然会考虑a function + replicate 作为更清晰、更易于阅读的替代方案。