【发布时间】:2021-04-13 20:44:25
【问题描述】:
我正在尝试对本文中的 CIBSE 日链接算法进行功能化:https://www.researchgate.net/publication/245383326_New_algorithm_for_generating_hourly_temperature_values_using_daily_maximum_minimum_and_average_values_from_climate_models
我只对在种植日期之后和最后收获日期之前的几天内产生温度感兴趣。这就是为什么我有条件语句为种植日期前一天和最后收获日期后一天生成 999 个值。
dput(head(mydata) 输出:
结构(列表(天气日期 = 结构(c(18324、18325、18326、
18327, 18328, 18329), class= "日期"), Temp Max = c(17.9160003662109,
22.1219997406006, 25.9589996337891, 27.1350002288818, 26.2180004119873,
16.5909996032715), Temp Min = c(2.16199994087219, 3.24499988555908,
5.54199981689453、7.40899991989136、8.51900005340576、6.23899984359741
), Time Max = c(15, 15, 15, 15, 15, 15), Time Min = c(5,
5, 5, 5, 5, 5), 植物日期 = 结构(c(18325, 18325, 18325,
18325, 18325, 18325), class= "日期"), Last Harvest Date for that FV = 结构(c(1595116800,
1595116800, 1595116800, 1595116800, 1595116800, 1595116800), class= c("POSIXct",
"POSIXt"), tzone = "UTC")), row.names = c(NA, 6L), class= "data.frame")
数据样本:
weather_date = as.POSIXct(c("2020-03-03", "2020-03-04", "2020-03-05", "2020-03-06", "2020-03-07", "2020-03-08"))
`Temp Max` = c(17.916, 22.122, 25.959, 27.135, 26.218, 16.591)
`Temp Min` = c(2.162, 3.245, 5.542, 7.409, 8.519, 6.239)
`Time Min` = c(5,5,5,5,5,5)
`Time Max` = c(15,15,15,15,15,15)
plant_date = as.POSIXct(c("2020-03-04", "2020-03-04", "2020-03-04", "2020-03-04", "2020-03-04", "2020-03-04"))
`Last Harvest Date for that FV` = as.POSIXct(c("2020-07-19 UTC", "2020-07-19 UTC", "2020-07-19 UTC", "2020-07-19 UTC", "2020-07-19 UTC", "2020-07-19 UTC"))
use_me <- as.data.frame(cbind(weather_date,`Temp Max`,`Temp Min`,
`Time Min`,`Time Max`,plant_date,`Last Harvest Date for that FV`))
函数创建:
CIBSE_Link <- function(WD,PD,LD,TempMin,TempMax,TimeMin,TimeMax){
TempTime = list()
t = 0:23
for (i in 1:length(WD)){
if(WD[i] < PD[i]){
for(h in 1:24){
TempTime[[i]][h] = 999
}
}
else if (WD[i] >= PD[i] & WD[i] < LD[i]){
for(j in 1:24){
TempTime[[i]][j] = ifelse(t[j] < TimeMin[i],
((TempMin[i] + TempMax[i-1])/2) -
(
((TempMin[i] - TempMax[i-1])/2) * cos((pi*(t[j]-TimeMax[i-1]))/(TimeMin[i] - TimeMax[i-1]))
),
ifelse(t[j] >= TimeMin[i] & t[j] < TimeMax[i],
((TempMax[i] + TempMin[i])/2) -
(
((TempMax[i] - TempMin[i])/2) * cos( (pi*(t[j]-TimeMin[i]))/(TimeMax[i] - TimeMin[i]))
),
ifelse(t[j]>= TimeMax[i],
((TempMin[i+1] + TempMax[i])/2) -
(
((TempMin[i+1] - TempMax[i])/2) * cos((pi*(t[j]-TimeMax[i]))/(TimeMin[i+1] - TimeMax[i]))
),
999)))
}
}
else{
for(k in 1:24){
TempTime[[i]][k] = 999
}
}
}
}
我是如何调用函数的:
CIBSE_Link(WD=use_me$weather_date,
PD=use_me$plant_date,
LD=use_me$`Last Harvest Date for that FV`,
TempMin = use_me$`Temp Min`,
TempMax = use_me$`Temp Max`,
TimeMin = use_me$`Time Min`,
TimeMax = use_me$`Time Max`)
我收到的错误:*tmp*[[i]] 中的错误:下标越界
我已经阅读了几个嵌套循环线程,其中 op 遇到了相同的错误,但我无法确定我的问题是什么。任何帮助将不胜感激!
【问题讨论】:
标签: list function for-loop nested-loops