运行外部R脚本n次并将输出保存在数据框中

时间:2015-03-01 11:04:04

标签: r knitr

我有一个包含几个随机函数的数百行的R脚本。每次我运行它都会得到不同的结果。

我正在考虑对我的模型进行敏感度分析,并且我有兴趣运行我的脚本数百次并比较结果。

经过一些研究,我发现lapplyknitr的组合可能是一种可能的解决方案:

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的值存储在列表中。

3 个答案:

答案 0 :(得分:3)

尝试添加records添加脚本的结尾,以便输出records数据框。

然后您可以运行:

result_list<-lapply(1:100, function(n)source("your_script.R"))

如果您想要rbind所有数据框,您可以执行以下操作:

do.call(cbind,lapply(result_list,function(x) x$value))

答案 1 :(得分:1)

另一种选择是将脚本包装成函数:

my_function <- function() {

位于顶部,

}

在底部。

这样,您可以source一次,然后使用plyr包中的ldply

results <- rdply(100, myFunction())

如果您希望列标识哪个迭代,则可以使用:

results <- ldply(1:100, function(i) data.frame(iteration = i, myFunction())

答案 2 :(得分:0)

您可以尝试以下命令;请注意,您可以将时间更改为您想要的任何数字

repeatedfunction <- c(mapply(list, FUN=**the name of your function** (args),times=100 ))