我已编写下面的代码,但处理时间过长。处理一次运行大约需要40秒,似乎我需要超过5000轮才能获得合适质量的数据。
毫无疑问,有些时候是因为R方面的笨重编码。是否有人愿意看看这个并给我一些想法,让它更优雅,更快?
由于 亚伦
#THIS IS FOR MONTE CARLO ERF PROJECT
library(xlsx, openxlsx)
#number of loops
n <- 500
#number of years in files for run
years <- 99
#setup matrix for final data output
finaldata <- matrix(nrow = n, ncol = 8)
colnames(finaldata) <- c("kgno", "liveweight", "mark", "DSEdiff", "N2Oreudc", "limereduc", "C in char", "mit")
#kg of each gas per kg of global meat from ecoinvent.
CO2kg <- -3.887
N2Okg <- -3.51
CH4kg <- -7.02
otherkg <- -0.106
#this gets the baseline data from which production changes are added/subtracted
baseline <- read.csv("C:/Rfilesformonte/baseline.csv", header = FALSE)
baseline <- as.data.frame(baseline)
ptm <- proctime()
#loop through runs for analysis
for (i in 1:n)
{
ptm <- proc.time()
####PRODUCTION CHANGES#######
#parameters
DSEewe <- 2.5
liveweight <- runif(1, 15.0, 30.0) #this is liveweright per lamb at sale
mark <- runif(1, 0.5, 1.2) #percentage marking rate
basestock <- runif(1, 0.2, 0.24) #base stocking rate DSE ha
newstock <- runif(1,0.3,0.48) #new dtocking rate DSE ha
DSEdiff <- newstock - basestock
Ewehabase <- basestock/DSEewe #stocking rate ewe ha for baseline
Ewehanew <- newstock/DSEewe #stocking rate ewe ha for new
#calculate production change where kgno is relative increase in liveweight
kgno <- Ewehanew*mark*liveweight - Ewehabase*mark*liveweight
######N2O REDUCTIONS#######
#parameters
N2Opercreduc <- runif(1, 0.0, 0.5) #percentage reduction in N2O associated with biochar application
N2Oha <- -0.475 #N2O per ha for wheat in NSW Vic slopes associated with fert use
N2Oreduc <- N2Opercreduc*N2Oha #absolut value in N20 reduction
#####LIME REDUCTIONS#####
limeperreduc <- runif(1,0.0,100.0)
limeha <- - 71.3 #CO2 emissions from lime use per ha from NSW Vic slopes
limereduc <- limeperreduc*limeha
for (j in 2:years)
{
#year 1 has no production so not looped through
CO2bcy1 <--2.05
N2Obcy1 <- -0.0043
CH4bcy1 <- -0.09173
otherbcy1 <- 0.000635
assign(paste0("CO2bcy",j), baseline[j,3] + CO2kg*kgno)
assign(paste0("N2Obcy",j), baseline[j,4]+N2Okg*kgno)
assign(paste0("CH4bcy",j), baseline[j,5]+CH4kg*kgno)
assign(paste0("otherbcy", j), baseline[j,6] +otherkg*kgno)
}
#subtract avoided N2O emissions from year 2 of scenario when it is applied in YOung to wheat
N2Obcy2 <- N2Obcy2 + N2Oreduc
CO2bcy2 <- CO2bcy2 + limereduc
CO2bcy3 <- CO2bcy3 + limereduc
CO2bcy4 <- CO2bcy4 + limereduc
CO2bcy5 <- CO2bcy5 + limereduc
CO2bcy6 <- CO2bcy6 + limereduc
#collate data
print("collating data")
CO2data <- c(CO2bcy1, CO2bcy2, CO2bcy3, CO2bcy4, CO2bcy5, CO2bcy6, CO2bcy7, CO2bcy8, CO2bcy9, CO2bcy10, CO2bcy11, CO2bcy12, CO2bcy13, CO2bcy14, CO2bcy15, CO2bcy16, CO2bcy17, CO2bcy18, CO2bcy19, CO2bcy20, CO2bcy21, CO2bcy22, CO2bcy23, CO2bcy24, CO2bcy25, CO2bcy26, CO2bcy27, CO2bcy28, CO2bcy29, CO2bcy30, CO2bcy31, CO2bcy32, CO2bcy33, CO2bcy34, CO2bcy35, CO2bcy36, CO2bcy37, CO2bcy38, CO2bcy39, CO2bcy40, CO2bcy41, CO2bcy42, CO2bcy43, CO2bcy44, CO2bcy45, CO2bcy46, CO2bcy47, CO2bcy48, CO2bcy49, CO2bcy50, CO2bcy51, CO2bcy52, CO2bcy53, CO2bcy54, CO2bcy55, CO2bcy56, CO2bcy57, CO2bcy58, CO2bcy59, CO2bcy60, CO2bcy61, CO2bcy62, CO2bcy63, CO2bcy64, CO2bcy65, CO2bcy66, CO2bcy67, CO2bcy68, CO2bcy69, CO2bcy70, CO2bcy71, CO2bcy72, CO2bcy73, CO2bcy74, CO2bcy75, CO2bcy76, CO2bcy77, CO2bcy78, CO2bcy79, CO2bcy80, CO2bcy81, CO2bcy82, CO2bcy83, CO2bcy84, CO2bcy85, CO2bcy86, CO2bcy87, CO2bcy88, CO2bcy89, CO2bcy90, CO2bcy91, CO2bcy92, CO2bcy93, CO2bcy94, CO2bcy95, CO2bcy96, CO2bcy97, CO2bcy98, CO2bcy99)
N2Odata <- c(N2Obcy1, N2Obcy2, N2Obcy3, N2Obcy4, N2Obcy5, N2Obcy6, N2Obcy7, N2Obcy8, N2Obcy9, N2Obcy10, N2Obcy11, N2Obcy12, N2Obcy13, N2Obcy14, N2Obcy15, N2Obcy16, N2Obcy17, N2Obcy18, N2Obcy19, N2Obcy20, N2Obcy21, N2Obcy22, N2Obcy23, N2Obcy24, N2Obcy25, N2Obcy26, N2Obcy27, N2Obcy28, N2Obcy29, N2Obcy30, N2Obcy31, N2Obcy32, N2Obcy33, N2Obcy34, N2Obcy35, N2Obcy36, N2Obcy37, N2Obcy38, N2Obcy39, N2Obcy40, N2Obcy41, N2Obcy42, N2Obcy43, N2Obcy44, N2Obcy45, N2Obcy46, N2Obcy47, N2Obcy48, N2Obcy49, N2Obcy50, N2Obcy51, N2Obcy52, N2Obcy53, N2Obcy54, N2Obcy55, N2Obcy56, N2Obcy57, N2Obcy58, N2Obcy59, N2Obcy60, N2Obcy61, N2Obcy62, N2Obcy63, N2Obcy64, N2Obcy65, N2Obcy66, N2Obcy67, N2Obcy68, N2Obcy69, N2Obcy70, N2Obcy71, N2Obcy72, N2Obcy73, N2Obcy74, N2Obcy75, N2Obcy76, N2Obcy77, N2Obcy78, N2Obcy79, N2Obcy80, N2Obcy81, N2Obcy82, N2Obcy83, N2Obcy84, N2Obcy85, N2Obcy86, N2Obcy87, N2Obcy88, N2Obcy89, N2Obcy90, N2Obcy91, N2Obcy92, N2Obcy93, N2Obcy94, N2Obcy95, N2Obcy96, N2Obcy97, N2Obcy98, N2Obcy99)
CH4data <- c(CH4bcy1, CH4bcy2, CH4bcy3, CH4bcy4, CH4bcy5, CH4bcy6, CH4bcy7, CH4bcy8, CH4bcy9, CH4bcy10, CH4bcy11, CH4bcy12, CH4bcy13, CH4bcy14, CH4bcy15, CH4bcy16, CH4bcy17, CH4bcy18, CH4bcy19, CH4bcy20, CH4bcy21, CH4bcy22, CH4bcy23, CH4bcy24, CH4bcy25, CH4bcy26, CH4bcy27, CH4bcy28, CH4bcy29, CH4bcy30, CH4bcy31, CH4bcy32, CH4bcy33, CH4bcy34, CH4bcy35, CH4bcy36, CH4bcy37, CH4bcy38, CH4bcy39, CH4bcy40, CH4bcy41, CH4bcy42, CH4bcy43, CH4bcy44, CH4bcy45, CH4bcy46, CH4bcy47, CH4bcy48, CH4bcy49, CH4bcy50, CH4bcy51, CH4bcy52, CH4bcy53, CH4bcy54, CH4bcy55, CH4bcy56, CH4bcy57, CH4bcy58, CH4bcy59, CH4bcy60, CH4bcy61, CH4bcy62, CH4bcy63, CH4bcy64, CH4bcy65, CH4bcy66, CH4bcy67, CH4bcy68, CH4bcy69, CH4bcy70, CH4bcy71, CH4bcy72, CH4bcy73, CH4bcy74, CH4bcy75, CH4bcy76, CH4bcy77, CH4bcy78, CH4bcy79, CH4bcy80, CH4bcy81, CH4bcy82, CH4bcy83, CH4bcy84, CH4bcy85, CH4bcy86, CH4bcy87, CH4bcy88, CH4bcy89, CH4bcy90, CH4bcy91, CH4bcy92, CH4bcy93, CH4bcy94, CH4bcy95, CH4bcy96, CH4bcy97, CH4bcy98, CH4bcy99)
otherdata <- c(otherbcy1, otherbcy2, otherbcy3, otherbcy4, otherbcy5, otherbcy6, otherbcy7, otherbcy8, otherbcy9, otherbcy10, otherbcy11, otherbcy12, otherbcy13, otherbcy14, otherbcy15, otherbcy16, otherbcy17, otherbcy18, otherbcy19, otherbcy20, otherbcy21, otherbcy22, otherbcy23, otherbcy24, otherbcy25, otherbcy26, otherbcy27, otherbcy28, otherbcy29, otherbcy30, otherbcy31, otherbcy32, otherbcy33, otherbcy34, otherbcy35, otherbcy36, otherbcy37, otherbcy38, otherbcy39, otherbcy40, otherbcy41, otherbcy42, otherbcy43, otherbcy44, otherbcy45, otherbcy46, otherbcy47, otherbcy48, otherbcy49, otherbcy50, otherbcy51, otherbcy52, otherbcy53, otherbcy54, otherbcy55, otherbcy56, otherbcy57, otherbcy58, otherbcy59, otherbcy60, otherbcy61, otherbcy62, otherbcy63, otherbcy64, otherbcy65, otherbcy66, otherbcy67, otherbcy68, otherbcy69, otherbcy70, otherbcy71, otherbcy72, otherbcy73, otherbcy74, otherbcy75, otherbcy76, otherbcy77, otherbcy78, otherbcy79, otherbcy80, otherbcy81, otherbcy82, otherbcy83, otherbcy84, otherbcy85, otherbcy86, otherbcy87, otherbcy88, otherbcy89, otherbcy90, otherbcy91, otherbcy92, otherbcy93, otherbcy94, otherbcy95, otherbcy96, otherbcy97, otherbcy98, otherbcy99)
#aggregate data into data frame and save
inputdata <- cbind(CO2data,N2Odata,CH4data,otherdata)
inputdata <- as.data.frame(inputdata)
write.xlsx(inputdata, "C:/Rfilesformonte/Input.xlsx", sheetName="Sheet1",
col.names=FALSE, row.names=FALSE, append=FALSE, showNA=TRUE)
print("running shell")
shell("C:\\Rfilesformonte\\Monte.vbs", mustWork = FALSE)
#Sys.sleep(1)
import <- read.csv("C:/Rfilesformonte/AD emissions calculations for R.csv")
import$Biochar <- as.numeric(import$Biochar)
finaldata[i, 1] <- kgno
finaldata[i, 2] <- liveweight
finaldata[i, 3] <- mark
finaldata[i, 4] <- DSEdiff
finaldata[i, 5] <- N2Oreduc
finaldata[i, 6] <- limereduc
finaldata[i, 7] <- -1.03 #Need to actually calculate this and take from a spreadsheet
finaldata[i, 8] <- import[99,4]
print(paste("run", i, "of", n, "complete"))
time <- proc.time() - ptm
print(time)
}
str(finaldata)
finaldata