【问题标题】:R function creation: Nested Looping "Error in `*tmp*`[[i]] : subscript out of bounds"R 函数创建:嵌套循环“`*tmp*`[[i]] 中的错误:下标越界”
【发布时间】: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


    【解决方案1】:

    我能够整理出我的问题的答案。当我试图在使用 i 循环构建的列表对象内创建 j 对象的向量时,嵌套循环中似乎出现了问题。一个简单的错误,一个简单的答案。我确信有一种更聪明的方法可以做到这一点,但这很有效。有关更多信息,请查看我的 GitHub 上的以下存储库:https://github.com/harrisonmckenny/CIBSE-Sin-14-R-1-Algorithms

    CIBSE_Link <- function(WD,PD,LD,TempMin,TempMax,TimeMin,TimeMax){
    
    #Initializing list & vectors:
      
    TempTime = list()
      
    smallvec_pre = c()
      
    season_vec = c()
      
    smallvec_post = c()
    
    t = 0:23 #Military Time (R is not zero-indexed)
     
    #Conditional Statement Waterfall:
    
    
     for (i in 1:length(WD)){ #day before planting
     
     if(WD[i] < PD[i]){
       
       for(h in 1:length(t)){
         
    smallvec_pre[h] = 999
    
       }
       
       TempTime[[i]] <- smallvec_pre
     
     }
       
     else if (WD[i] >= PD[i] & WD[i] <= LD[i]){ #while plants are in ground
    
    #Looping through linking day algorithm   
          
    for(j in 1:length(t)){
    
    season_vec[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)))
    }
       
       TempTime[[i]] <- season_vec #building list of hourly observations for each day
       
     }
       
       else{ #day after harvest is finished
      
    for(k in 1:length(t)){ 
    
    smallvec_post[k] = 999
    
    }
         
    TempTime[[i]] <- smallvec_post
    
         }
       
     }
    
    TempTime[[length(WD)]] <- NULL #Must Null the day after harvest first because nullifying drops the index, so if we drop the day before harvest first, we cant use length(WD) as an argument
    
    TempTime[[1]] <- NULL
    
    
    
    return(TempTime) #list of hourly observations less the day before planting and after completed harvest
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多