Включение функции остановки в случайной прогулке
В моем предыдущем вопросе: Как мне установить пределы арены при случайной прогулке? Сообщество помогло создать функцию случайного блуждания на арене. Эта функция предназначена для имитации рыбы, движущейся по области, но теперь мне нужно решить, когда остановиться, когда выполнено определенное условие.
Я думал, что это будет так же просто, как{{if(z>P)break}}
вставьте непосредственно перед функцией цикла. Я хочу, чтобы он понял: "Если это условие выполнено, остановитесь, в противном случае продолжайте, пока не достигнете максимального количества шагов.
Вместо этого это привело к тому, что мое случайное блуждание стало детерминированным (у меня всегда один и тот же путь, и он никогда не останавливается до step.max).
Основной вопрос: как я могу сказать случайному блужданию остановиться, если z>P?
Для справки:
step.max<-125
step.prob<-function(n.times=step.max){
draw=sample(0:100,1,replace=T)
CS<-sample(draw,size=1,replace=TRUE)
CS.max<-100
step.num<-15
SP<-((CS/CS.max)*(1-(step.num/step.max))+(step.num/step.max))*100
if(SP>P){stop('Settled at step number',P)}else{SP
}
}
z<-step.prob(1) #renaming the above function to be easier to reference later
P<-80 #preset cutoff point for value z, ranges from 0-100
walkE <- function(n.times=125,
xlim=c(524058,542800),
ylim=c(2799758,2818500),
start=c(525000,2810000),
stepsize=c(4000,4000)) {
plot(c(0,0),type="n",xlim=xlim,ylim=ylim,
xlab="Easting",ylab="Northing")
x <- start[1]
y <- start[2]
steps <- 1/c(1,2,4,8,12,16)
steps.y <- c(steps,-steps,0)
steps.x <- c(steps,-steps[c(1,5,6)],0)
points(x,y,pch=16,col="red",cex=1)
for (i in 1:n.times) {
repeat {
xi <- stepsize[1]*sample(steps.x,1)
yi <- stepsize[2]*sample(steps.y,1)
newx <- x+xi
newy <- y+yi
if (newx>xlim[1] && newx<xlim[2] &&
newy>ylim[1] && newy<ylim[2]) break
}
lines(c(x,newx),c(y,newy),col="blue")
x <- newx
y <- newy
if(z>P){stop(points(newx,newy,col="green",cex=1))}
#this is where I want it to stop if z>P
else
if(z<P){points(newx,newy,pch=1,col="blue",cex=1)}
else
if(step.max){points(newx,newy,pch=16,col="green",cex=1)}
set.seed(101)}
}
walkE(step.max) #run above random walk function walkE looped for the step.max number
Заранее спасибо!!!
1 ответ
Это довольно легко и может быть достигнуто путем вставки stop(...)
функция в вашем пользовательском step.prob
функция.
step.prob<-function(n.times=step.max, p){
draw=sample(0:100,1,replace=T)
CS<-sample(draw,size=1,replace=TRUE)
CS.max<-100
CS.max
step.num<-15
SP<-((CS/CS.max)*(1-(step.num/step.max))+(step.num/step.max))*100
if(SP > p) {
stop('Your random walk exceeded ', p)
} else {
SP
}
}
Если это не поможет, загляните в break
команда.
Итак, когда значение случайного блуждания> p:
step.prob(p=300000)
# Error in step.prob(p = 3) : Your random walk exceeded 3
И если вы хотите установить значение, возвращаемое функцией в р, вы можете просто добавить в SP <- p
перед stop
команда.