R语言自定义函数结合while循环未按预期运行问题排查
问题:while循环中商圈计算结果未更新
我是R语言初学者,通过Datacamp和RStudio学习R用于学业研究。现有census矩阵,已编写trading_area函数可正常计算指定坐标与半径下的商圈数据,但后续使用while循环从坐标c(89,155)开始,每次向东移动2km搜索符合条件(居民≥8000、家庭年均收入≥23000欧元或X坐标>230)的商圈时,发现坐标能正常变化,但居民总数与加权平均收入始终未更新,代码运行不符合预期。
相关数据与代码
census矩阵
Area Inhabit XCOORD YCOORD s_tot_family rev_avg 11001A00- 52.6211 2104 151.3999 202.4849 931 28356 11001A01- 66.4397 2731 151.1110 203.2089 1094 35508 11001A020 27.7954 845 150.4315 203.3277 327 41776 11001A030 42.7325 463 150.9282 203.8764 180 29008 11001A042 25.3009 422 151.6225 203.5632 152 54203 11001A052 33.3881 2451 151.0243 202.2535 948 31931
trading_area函数
trading_area <- function(census,b=5,c,d){ str_coord <- c(c,d) distances <- c(sqrt((str_coord[1]-census[,3])^2+(str_coord[2]-census[,4])^2)) selected_block <- subset(census, distances <=b) total_inhabit <- sum(selected_block[,2]) mean_inc <- weighted.mean(selected_block[,6],selected_block[,5]) target <- list(selected_block,mean_inc,total_inhabit) names(target) <- c("selected_block","mean_inc","total_inhabit") return(target) }
原while循环代码
#1d considered_xy <- matrix(str_coord,nrow = 2,byrow = TRUE, dimnames = list(c("X.COORD","Y.COORD"), c("V1"))) inhainco <- matrix(c(total_inhabit,mean_inc),ncol = 2,byrow = FALSE, dimnames = list(c("X1"),c("total_inhabit","mean_inc"))) while (str_coord[1]<229) { str_coord[1] <- str_coord[1]+2 trading_area(census,5,str_coord[1],155) considered_xy <- cbind(considered_xy,c(str_coord[1],155)) inhainco <- rbind(inhainco,c(target$total_inhabit,target$mean_inc)) print(target) }
问题原因分析
- 未接收函数返回值:调用
trading_area时没有将结果赋值给target变量,导致循环中始终使用初始的target值(甚至可能是未定义的旧值),无法获取每次计算的新结果。 - 初始化变量缺失:初始化
considered_xy和inhainco时,str_coord、total_inhabit、mean_inc未提前定义,会导致运行错误。 - 未添加停止条件判断:原代码没有在符合搜索条件时跳出循环,无法实现“找到符合条件的商圈即停止”的需求。
修正后的代码
# 初始化起始坐标 str_coord <- c(89, 155) # 先计算初始坐标的商圈数据,避免变量未定义 target <- trading_area(census, 5, str_coord[1], str_coord[2]) # 初始化存储坐标的矩阵 considered_xy <- matrix(str_coord, nrow = 2, byrow = TRUE, dimnames = list(c("X.COORD", "Y.COORD"), c("V1"))) # 初始化存储结果的矩阵 inhainco <- matrix(c(target$total_inhabit, target$mean_inc), ncol = 2, byrow = FALSE, dimnames = list(c("X1"), c("total_inhabit", "mean_inc"))) # 开始循环搜索 while (str_coord[1] < 229) { # 向东移动2km str_coord[1] <- str_coord[1] + 2 # 调用函数并接收返回的新结果 target <- trading_area(census, 5, str_coord[1], str_coord[2]) # 更新坐标和结果存储矩阵 considered_xy <- cbind(considered_xy, str_coord) inhainco <- rbind(inhainco, c(target$total_inhabit, target$mean_inc)) # 检查是否符合停止条件,满足则跳出循环 if (target$total_inhabit >= 8000 || target$mean_inc >= 23000 || str_coord[1] > 230) { break } print(target) }
关键修正点
- 赋值函数返回值:每次调用
trading_area后,必须将结果赋值给target,确保循环使用最新的计算结果。 - 完善初始化:提前定义起始坐标,并先计算一次初始商圈数据,避免变量未定义错误。
- 添加停止条件:在循环内加入判断逻辑,当满足居民数、收入或坐标条件时,立即停止搜索。
内容的提问来源于stack exchange,提问作者Minh_DZ_242
相关产品推荐
相关产品推荐

