You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言循环调用getLagSequences函数报错及结果缺失求助

问题分析与解决

错误原因

报错rep(no length.out = len):attempt to replicate an object of type 'closure'的核心问题是用ifelse()传递函数对象(sum/mean)的方式错误。ifelse是向量化函数,设计用于处理向量级别的条件判断,不适合返回sum/mean这类函数对象——它会将函数转换为closure类型的引用,导致getLagSequences内部调用rep时无法正确处理对象类型。

循环中仅tp能正常运行是因为当clim == "tp"时,ifelse碰巧返回了可识别的sum函数对象,但逻辑本身存在隐患;当处理t2m时,错误的函数传递方式直接触发了报错。

解决方案

将传递aggr_function的ifelse替换为基础的if...else结构(适合单个逻辑值判断的场景),确保传递的是正确的函数对象。

修正后的完整代码

###### use the same iteration_length for all climate variables

climate_variables <- c("tp","t2m")

tmp_lag <- data.frame(Date=tmp$Date, HP=tmp$HP) %>% 
  mutate_if(is.factor, as.character)

for (clim in climate_variables) {
  message('=== ',{clim},' ===== ')
  
  df1 <- tmp %>%  select(Date, Input = all_of(clim))
  o1 <- getLagSequences(df1$Input, 
                        aggr_function = if(clim == "tp") sum else mean, # 改用if...else传递函数
                        iteration = ifelse(clim == "t2m", iteration_length/2, iteration_length)) # 此处ifelse处理数值没问题
  colnames(o1$df_cumulative) <- colnames(o1$df_cumulative) %>% paste0(clim, "_",.)
  
  tmp_lag <- cbind(tmp_lag, o1$df_cumulative)
}

额外说明

  • iteration参数使用ifelse是合理的,因为它处理的是数值型向量(单个数值),符合ifelse的使用场景。
  • 确保iteration_length已在代码中提前定义为数值型变量,避免出现其他潜在错误。

内容的提问来源于stack exchange,提问作者The_Wusman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:25:24