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
相关产品推荐
相关产品推荐

