R函数报错求助:Number of items to replace非替换长度倍数问题
问题解决:"Number of items to replace is not a multiple of replacement length" 错误修复
错误根源
- 二维数组索引写法错误:R中访问二维矩阵/数组的元素必须使用
[行, 列]格式,你代码里的predicted_lambda[row][column]会先提取第row行的完整向量(长度10),再取该向量的第column个元素,赋值时会引发长度不匹配的错误。 - while循环条件逻辑错误:
(column && idx) <=10的判断逻辑不符合预期——column && idx会先将两个数值转为布尔值做逻辑运算,结果是单个布尔值(对应1或0),这会导致循环无法按你预期的终止条件执行,可能触发超出索引的问题。
修改后的主函数代码
predicted_choices_lambda <- function() { # 提前生成lambda序列,避免循环内重复创建 lambda <- seq(0.5, 5, by = 0.5) predicted_lambda <- array(dim = c(100, 10)) for(row in 1:100) { column <- 1 idx <- 1 # 修正循环条件:同时判断column和idx都不超过10 while(column <= 10 && idx <= 10) { if(normative_value_lambda(row, lambda[idx]) > 0) # 修正二维数组索引方式 predicted_lambda[row, column] <- TRUE else predicted_lambda[row, column] <- FALSE column <- column + 1 idx <- idx + 1 } } return(predicted_lambda) }
额外优化建议
- 把
while循环替换为for循环,逻辑更直观:
predicted_choices_lambda <- function() { lambda <- seq(0.5, 5, by = 0.5) predicted_lambda <- array(dim = c(100, 10)) for(row in 1:100) { for(col in 1:10) { # 直接用逻辑表达式赋值,简化代码 predicted_lambda[row, col] <- normative_value_lambda(row, lambda[col]) > 0 } } return(predicted_lambda) }
- 辅助函数可以提前提取数据,避免循环内重复子集化操作,提升运行效率:
# 先加载数据集 gd <- read.table("gambledata.txt", header = TRUE) # 提前提取所需列并转换格式 win_percents <- as.numeric(gd$percent) wins <- as.numeric(gd$gain) losses <- as.numeric(gd$loss) normative_value_lambda <- function(trial.index, lambda) { win_percent <- win_percents[trial.index] loss_percent <- 1 - win_percent win <- wins[trial.index] lose <- losses[trial.index] return((win * win_percent) + (lambda * lose * loss_percent)) }
内容的提问来源于stack exchange,提问作者Sage
相关产品推荐
相关产品推荐

