我有一个包含数百行的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一样
除此方法外,还有其他方法可以重复此过程吗?
答案 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]