多次重复 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
作为更清晰、更易于阅读的替代方案。
我有一个包含数百行的 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
作为更清晰、更易于阅读的替代方案。