运行 外部 R 脚本 n 次并将输出保存在数据框中
Run external R script n times and save outputs in a data frame
我有一个数百行的 R 脚本,其中包括几个随机化函数。每次我 运行 它都会得到不同的结果。
我正在考虑对我的模型进行敏感性分析,我有兴趣 运行 对我的脚本进行数百次测试并比较结果。
经过一些研究,我发现 lapply
和 knitr
的组合可能是一个可能的解决方案:
result <- c("B:/Documents/result.R")
resultsList <- lapply(1:100, function(n) knit(input=result, NULL))
不幸的是,这不起作用。谁能解释一下为什么?
非常感谢!
更新
脚本如下所示:
#Records
dataID = c(01, 03, 05)
localityNumber = c(2000, 4000, 5000)
records = data.frame(dataID, localityNumber)
#Locality number / Postcode conversion table
localityNumber = c(2000, 2000, 2000, 4000, 5000)
postCode = c(6766, 6767, 6768, 7041, 8046)
allocationTable = data.frame(localityNumber,postCode)
rm(dataID, localityNumber, postCode)
#Create random postcode id
count <- aggregate(allocationTable, by=list(allocationTable$localityNumber), FUN=length)
names(count) <- c("localityNumber", "count", "count.2")
allocationTable <- join(x=allocationTable, y=count)
#Test with for localityNumber with three postcodes
allocationThree <- allocationTable[which (allocationTable$count == "3"),]
testThree <- nrow(allocationThree) / 3
repThree <- rep(1:3, testThree)
allocationThree$id <- repThree
allocationThree$count <- allocationThree$count.2 <- NULL
rm(count, rep, testThree)
records$id <- repThree
#Randomly allocate
records <- join(records, allocationThree)
我想多次重复此脚本并将 records
data.frame 的值存储在列表中。
你可以试试下面的命令;请注意,您可以将时间更改为您想要的任何数字
repeatedfunction <- c(mapply(list, FUN=**the name of your function** (args),times=100 ))
尝试添加 records
添加脚本的末尾,以便它输出 records
数据帧。
然后您可以运行:
result_list<-lapply(1:100, function(n)source("your_script.R"))
如果你想rbind
所有数据帧,你可以这样做:
do.call(cbind,lapply(result_list,function(x) x$value))
另一种选择是将脚本包装成一个函数,方法是:
my_function <- function() {
在顶部并且
}
在底部。
这样,您可以 source
它一次,然后使用 plyr 包中的 ldply
:
results <- rdply(100, myFunction())
如果您想要一个列来标识哪个迭代,您可以使用:
results <- ldply(1:100, function(i) data.frame(iteration = i, myFunction())
我有一个数百行的 R 脚本,其中包括几个随机化函数。每次我 运行 它都会得到不同的结果。
我正在考虑对我的模型进行敏感性分析,我有兴趣 运行 对我的脚本进行数百次测试并比较结果。
经过一些研究,我发现 lapply
和 knitr
的组合可能是一个可能的解决方案:
result <- c("B:/Documents/result.R")
resultsList <- lapply(1:100, function(n) knit(input=result, NULL))
不幸的是,这不起作用。谁能解释一下为什么?
非常感谢!
更新
脚本如下所示:
#Records
dataID = c(01, 03, 05)
localityNumber = c(2000, 4000, 5000)
records = data.frame(dataID, localityNumber)
#Locality number / Postcode conversion table
localityNumber = c(2000, 2000, 2000, 4000, 5000)
postCode = c(6766, 6767, 6768, 7041, 8046)
allocationTable = data.frame(localityNumber,postCode)
rm(dataID, localityNumber, postCode)
#Create random postcode id
count <- aggregate(allocationTable, by=list(allocationTable$localityNumber), FUN=length)
names(count) <- c("localityNumber", "count", "count.2")
allocationTable <- join(x=allocationTable, y=count)
#Test with for localityNumber with three postcodes
allocationThree <- allocationTable[which (allocationTable$count == "3"),]
testThree <- nrow(allocationThree) / 3
repThree <- rep(1:3, testThree)
allocationThree$id <- repThree
allocationThree$count <- allocationThree$count.2 <- NULL
rm(count, rep, testThree)
records$id <- repThree
#Randomly allocate
records <- join(records, allocationThree)
我想多次重复此脚本并将 records
data.frame 的值存储在列表中。
你可以试试下面的命令;请注意,您可以将时间更改为您想要的任何数字
repeatedfunction <- c(mapply(list, FUN=**the name of your function** (args),times=100 ))
尝试添加 records
添加脚本的末尾,以便它输出 records
数据帧。
然后您可以运行:
result_list<-lapply(1:100, function(n)source("your_script.R"))
如果你想rbind
所有数据帧,你可以这样做:
do.call(cbind,lapply(result_list,function(x) x$value))
另一种选择是将脚本包装成一个函数,方法是:
my_function <- function() {
在顶部并且
}
在底部。
这样,您可以 source
它一次,然后使用 plyr 包中的 ldply
:
results <- rdply(100, myFunction())
如果您想要一个列来标识哪个迭代,您可以使用:
results <- ldply(1:100, function(i) data.frame(iteration = i, myFunction())