多次重复R脚本

时间:2015-08-19 03:05:17

标签: r iteration repeat lapply

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

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

我的最终答案被命名为'结果'然后在新的脚本文件中

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一样

除此方法外,还有其他方法可以重复此过程吗?

2 个答案:

答案 0 :(得分:1)

我建议您将脚本作为一个函数,加载函数一次,然后使用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

现在,将必须简单地运行100次的source 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

如果在处理过程中占用更多的时间(而不是阅读源文件),我不确定它在长期内会产生多大的差别,但我仍然会考虑一个函数+ {{1作为一种更清晰,更易于阅读的替代方案。

答案 1 :(得分:0)

我们可以使用$value获取&#39;值&#39;从每次迭代

 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]