[英]Subscript out of bounds, iteration for a bound random walk
我正在嘗試編寫一個 function 生成由單位球體約束的隨機游走,從而導致由向量給出的隨機游走的最后位置。 在試圖找出我的 function 壞在哪里時,我試着像這樣拼湊出來:
norm_vec <- function(x) sqrt(sum(x^2))
sphere_start_checker <- function() {
repeat {
start_loc <- runif(3, min = -1, max = 1)
if (norm_vec(start_loc) < 1) return(start_loc)
}
}
n <- 10
set.seed(1)
new_loc <- as.matrix(t(sphere_start_checker()))
temp_loc <- as.matrix(t(c(0, 0, 0)))
for(i in n) {
repeat {
temp_loc <- new_loc[i, ] + runif(3, min = -.01, max = .01)
if (norm_vec(temp_loc) < 1) {
return(new_loc <- rbind(new_loc, temp_loc))
}
}
}
new_loc
我收到錯誤:new_loc[i, ] 中的錯誤:下標越界
但是,當我在 for 循環之外手動迭代代碼時,一切正常。 我認為這與 R 的范圍規則有關,並且我嘗試將 rbind 的結果分配給全局環境,但這不起作用。
最初,我嘗試像這樣編寫 function:
randomwalk_sphere <- function(n, radius, stepmax) {
# initialize sphere bounds
sphere_radius <- as.double(radius)
# initialize random starting vector
# while loop that adds a random vector to our start_loc n times, repeating once boundary condition is met
loop <- 0
new_loc <- sphere_start_checker()
while(loop <= n) {
repeat {
temp_loc <- new_loc + runif(3, min = -stepmax, max = stepmax)
if (norm_vec(temp_loc) < sphere_radius) {
return(assign("new_loc", temp_loc, env = .GlobalEnv))
}
}
loop <- loop + 1
}
new_loc
}
但是當我這樣做時,while 循環似乎不起作用,我只是從均勻分布而不是從隨機游走中獲得初始 new_loc 坐標。 我意識到使用 rbind 可能是一種更正確的方法,但我有興趣了解為什么這種方法不起作用。
一些想法:
當您使用for (i in n)
“修復”問題時,規范(更常見)方法通常是將n
保留為單長度計數,並在for
調用中使用seq_len(n)
或類似方法,例如n <- 10; for (i in seq_len(n))
n <- 10; for (i in seq_len(n))
。
除了正式的return
function(.){..}
聲明以外的任何東西都是不正確的; 如果要停止repeat
,請使用break
。 如此處所示,重新分配的 scope 是不正確的,因此new_loc
永遠不會真正重新分配所有迭代的結果。
最終,一旦你停止嘗試從非函數return
,它就會起作用。
n <- 10
set.seed(1)
new_loc <- as.matrix(t(sphere_start_checker()))
temp_loc <- as.matrix(t(c(0, 0, 0)))
for (i in seq_len(n)) {
repeat {
temp_loc <- new_loc[i, ] + runif(3, min = -.01, max = .01)
if (norm_vec(temp_loc) < 1) {
new_loc <- rbind(new_loc, temp_loc)
break
}
}
}
new_loc
# [,1] [,2] [,3]
# -0.4689827 -0.2557522 0.1457067
# temp_loc -0.4608185 -0.2617186 0.1536745
# temp_loc -0.4519250 -0.2585026 0.1562568
# temp_loc -0.4606893 -0.2643831 0.1497879
# temp_loc -0.4569488 -0.2667010 0.1551848
# temp_loc -0.4569948 -0.2623487 0.1650229
# temp_loc -0.4593941 -0.2567998 0.1737170
# temp_loc -0.4651513 -0.2537663 0.1662281
# temp_loc -0.4698069 -0.2560440 0.1564959
# temp_loc -0.4721591 -0.2486502 0.1533029
# temp_loc -0.4725175 -0.2466589 0.1531737
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.