每当我尝试运行这段代码时:
omnibus[[scenario1$scnid]] <-
runTheSim(from = simStart, to = simEnd, scen = scenario1,
dmS = dmStatus, fcS = fcStatus, icS = icStatus,
dmF = demandFun, fcF = forecastFun, olF = oulFun,
rec1 = oneRecord, recs = allRecords,
store1 = empty1Store, stores = allStores)
我一直收到相同的错误:
Start on simulating inventory for scenario nAppr+dlp+1 from 20 to 2020.
Error: Input must be a vector, not NULL.
Run `rlang::last_error()` to see where the error occurred.
运行rlang::last_error()
和rlang::last_trace()
将显示以下内容:
<error/vctrs_error_scalar_type>
Input must be a vector, not NULL.
Backtrace:
1. global::runTheSim(...)
5. vctrs:::stop_scalar_type(.Primitive("quote")(NULL), "")
6. vctrs:::stop_vctrs(msg, "vctrs_error_scalar_type", actual = x)
Run `rlang::last_trace()` to see the full context.
> rlang::last_trace()
<error/vctrs_error_scalar_type>
Input must be a vector, not NULL.
Backtrace:
█
1. ├─global::runTheSim(...)
2. │ └─dplyr::lag(stores[[fctidx]]) sics.R:84:4
3. │ ├─vctrs::vec_c(...)
4. │ └─vctrs::vec_slice(inputs$x, seq_len(xlen - n))
5. └─vctrs:::stop_scalar_type(.Primitive("quote")(NULL), "")
6. └─vctrs:::stop_vctrs(msg, "vctrs_error_scalar_type", actual = x)
我的一个朋友运行同样的代码,没有得到一个错误,而是一个30的循环。
你能帮帮我吗?
谢谢!
发布于 2021-02-28 01:12:28
icIni <- list(leadtime = 5, review = 3, fixedConstant = 8, csl = 0.9)
str(icIni)
icIni[[1]] #or#
icIni$leadtime
icIni$safetyfactor <- qnorm(icIni$csl) # (unit) normal distribution!
str(icIni)
dmIni <- list(
bare = numeric(), # past observations (at times 1, ..., t-1, t, t+1, ...)
term = with(icIni, {leadtime + review}), # track blocks; 1 = no block
blck = numeric() # past blocked observations
)
fcIni <- list( # (initial) values for several parameters
initOK = FALSE, # has the list been properly initialized?
smthpar = list(alpha = .2, beta = 0.1, gamma = 0.1), # smoothing parameter
other = list(), # other stuff goes here (like for dlp/crs)
latestfc = NA
)
fctIDs = c("dlp", "crs", "nai", "zer", "ses")
oulIDs = c("nAppr", "errQ", "nMod", "qMod", "bootM", "Eq8", "Eq9", "fxCst")
demIds <- c("bernoulliPoisson","geometricUniform", "normal" )
# 2 Pick scenarios, and set-up objects (for storing) ----
# scenarios
approaches <- list(oulid = oulIDs, fctid = fctIDs,
demid = demIds, blck = c("1", "b"))
scenarios <- cross_df(approaches)
rm(approaches, fctIDs, oulIDs, demIds)
scenarios
scenarios <- mutate(scenarios,
lt = icIni$leadtime, rt = icIni$review,
agg = ifelse(blck =="1", lt+rt, 1),
csl = icIni$csl)
scenarios <- mutate(scenarios, scnid =
paste(oulid, fctid, blck, sep = "+"), .before = 1)
scenarios <- mutate(scenarios, fctidx = paste0(fctid, blck))
scenarios <- dataUnUsedInOul(scenarios) # adds variable usedinoul
scenarios <- setParameters4Dem(scenarios) # adds par. values for demand
scenarios
# select scenarios
myScenarios <- c("fxCst+crs+1","nAppr+dlp+b","errQ+nai+b",
"nMod+ses+b","Eq9+zer+1","bootM+crs+1") # example
myScenarios <- c("qMod+crs+1","qMod+dlp+1","bootM+crs+b","bootM+dlp+b")
tbFolder <- filter(scenarios, scnid %in% myScenarios)
tbFolder <- filter(scenarios, notinoul == "---")
tbFolder <- filter(scenarios, notinoul == "---"& demid == "bernoulliPoisson")
tbFolder
# tbFolder <- scenarios
# skeleton (empty) objects for keeping track of simulated values
# of forecasts and demands:
base1Store <- map_dfc(c("epoch", "dem", "blk"),
setNames, object = list(as.numeric(NA)))
base1Store
# inventory levels, amounts shipped and ordered, ...
oneRecord <- map_dfc(c("per", "bopNS", "bopIP", "orderArrival", "avail2Ship",
"demand", "required", "shipped", "unserved", "eopNS",
"eopIP", "canOrder", "orderPlaced", "oul"),
setNames, object = list(as.numeric(NA)))
# fill initial (right before simulation starts) inventory record with values:
oneRecord <- within(oneRecord, { orderPlaced <- eopNS <- eopIP <- 0 })
oneRecord
# constants: for length of time interval
numWarmUpForecasts <- 17
numInventorySimulations <- 2000
omnibus <- list() # collects all simulated data
# 3 Start Big Loop, picking one scenario at a time ----
tic("All loops:")
for (ii in 1:nrow(tbFolder)) { # ii <- 1; ii <- 2; ii <- 3
cat("\n"); tic("This loop")
dmStatus <- dmIni; fcStatus <- fcIni; icStatus <- icIni
scenario1 <- as.list(slice(tbFolder,ii)) # 1 scenario as a list
# str(scenario1)
TellMe <- paste0("Simulating scenario ", ii)
TellMe <- paste0(TellMe, " (",nrow(tbFolder),"): ", scenario1$scnid)
print(paste0(TellMe, " under ", scenario1$demid, " demand."))
demandFun <- with(scenario1, createRandomVariable(demid, par = c(par1, par2)))
# draw enough demands such that forecast parameters can be initialized
while (!fcStatus$initOK) {
dmStatus <- processNewValue(demandFun(), dmStatus)
if (scenario1$blck == "1"){
obsVals <- dmStatus$bare
} else { obsVals = dmStatus$blck } # if - else should not matter
fcStatus <- initializeForecasting1(scenario1, obsVals, fcStatus)
}
startingPeriods4Casts <- length(dmStatus$bare) # using $blck: same result
empty1Store <- mutate(base1Store, !! scenario1$fctidx := as.numeric(NA))
empty1Store
allStores <- slice(empty1Store, rep.int(1, startingPeriods4Casts))
allStores <- mutate(allStores, epoch = 1 : startingPeriods4Casts,
dem = dmStatus$bare, blk = dmStatus$blck)
allStores
# 3a Warming up: run forecast during warming up interval ----
forecastFun <- create4CastFunction(scenario1$fctid, fcS = fcStatus)
# and run forecasts on warming-up interval ...
for (jj in (1 : numWarmUpForecasts)) { # jj <- 1
t <- startingPeriods4Casts + jj # the current time period
dmStatus <- processNewValue(demandFun(), dmStatus)
oneStore <- update1Storage(t, dmStatus, forecastFun,
scenario1, oneS = empty1Store)
allStores <- bind_rows(allStores, oneStore)
}
allStores
icStatus$aggreg <- scenario1$agg
oulFun <- createOULRule(scenario1$oulid, xpar = icStatus)
allRecords <- oneRecord # allRecords will expand and collect all records
simStart <- allStores[[nrow(allStores), "epoch"]] + 1
simEnd <- simStart + numInventorySimulations
https://stackoverflow.com/questions/66400361
复制相似问题