R语言For循环报错:non-numeric argument to binary operator 求助
问题修复方案
错误根源
你遇到的non-numeric argument to binary operator错误,核心原因是:paste0("div", i - 1)返回的是字符串(比如"div0"、"div2"),不是变量存储的数值,直接对字符串做加法运算自然会报错。另外当i=1时,i-1=0,div0变量根本不存在,这也会触发错误。
修复后的代码
y <- as.numeric(readline("Enter number of files: ")) div <- nrow(df)/y z <- c(0, seq(from = 1, to = 20, by = 2)) x <- z[y] k <- 2 for(i in 1:x){ if(i %% 2 == 0){ assign(paste0("div", i), div * k) k <- k + 1 } else { # 处理i=1的边界情况,直接赋值div+1 if(i == 1){ assign(paste0("div", i), div + 1) } else { # 用get()获取前一个div变量的数值再做加法 assign(paste0("div", i), get(paste0("div", i - 1)) + 1) } } }
关键修改说明
- 用
get(paste0("div", i - 1))替代原代码中的paste0("div", i - 1):get()函数会根据字符串名称,提取对应变量的实际数值,确保加法运算的是数字而非字符串。 - 新增
i==1的判断:避免尝试调用未定义的div0,直接按照你的预期赋值div+1。
额外优化建议(base R)
其实不需要生成一堆div1、div2这类零散变量,直接生成索引区间向量会更简洁,后续拆分数据框也更方便。比如:
y <- as.numeric(readline("Enter number of files: ")) row_count <- nrow(df) # 计算每个拆分文件的行数,确保最后一组包含剩余行 split_sizes <- rep(floor(row_count/y), y) split_sizes[y] <- split_sizes[y] + row_count %% y # 生成拆分的起始和结束索引 split_indices <- c(0, cumsum(split_sizes)) # 循环拆分并保存 for(i in 1:y){ start <- split_indices[i] + 1 end <- split_indices[i+1] write.csv(df[start:end, ], paste0("split_file_", i, ".csv"), row.names = FALSE) }
这种方式避免了零散变量的管理逻辑,代码更易读且不易出错。
内容的提问来源于stack exchange,提问作者CecilF
相关产品推荐
相关产品推荐

