我知道这样做可能会更优雅 - 但是现在我只想了解这个逻辑......
我的问题是,当我为模拟做一个典型的Y[t]=Y[t-1]+i[t]
事情时,它在放入函数时不起作用。
我希望在每一行中输出一个数据帧,并且每行的正确变量值为t 1-10。
现在循环中的猫显示我出错了。
这是我的代码:
iter <- 10; i <- rep(0.1,iter);
i <- c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)
Y0 <- 0.25 ; O0 <- 4.16
Y <- rep(0,iter); O <- rep(0,iter)
Tot <- rep(0,iter)
t <- seq(1,iter) #start time and fill vector
Y[1]=Y0 #First iter
O[1]=O0
Tot[1]= Y0+O0
time<-rep(1,iter)#runtime unit
#This is a simplified version of the ICBM function, to test the logic and output
Isim <- function(i, h, Y0, O0,iter,time) {
for (t in 2:iter) {
time<- time+1
Y[t]=(Y[t-1]+i[t-1]); O[t]=(O[t-1]+i[t-1]); Tot[t]=Y[t]+O[t];
simout <- data.frame(i,Y0,O0,Y,O,Tot,time)
cat(time)
}
return(simout)
}
result <- Isim(i, h, Y0, O0,iter, time)
答案 0 :(得分:1)
(让我们抽象出你的代码无法运行的事实。)你在Y[t]=(Y[t-1]+i[t-1])
步骤中遇到了一个范围问题。让我们看一个可重复的小例子:
increment_a <- function() { a <- a + 1; print(a); }
a <- 0; print(a); increment_a(); print(a);
# [1] 0 # ok
# [1] 1 # ok
# [1] 0 # not what you expected
在increment_a
内,当R计算a + 1
时,它首先在函数环境中查找a
。该环境为空,然后在调用该函数的环境中查找a
:您的全局环境。它在那里找到它,值为0
。它会向1
添加0
,然后分配它(语句的a <-
部分)在本地环境,即函数的环境。 / p>
你怎么解决这个问题?您可以告诉R将a + 1
的结果分配给全球环境中的a
:使用<<-
代替<-
:
increment_a <- function() { a <<- a + 1; print(a); }
a <- 0; print(a); increment_a(); print(a);
# [1] 0
# [1] 1
# [1] 1
但是不建议这样做。这是危险的,会让你陷入困境。相反,您需要完全接受函数式编程风格。我建议你阅读http://en.wikipedia.org/wiki/Functional_programming的第一段,特别是关于没有副作用的函数的部分。这就是事情的运作方式:
return
语句使用函数的输出。<<-
。increment <- function(x) { x <- x + 1; print(x); return(x); }
a <- 0; print(a); a <- increment(a); print(a);
# [1] 0
# [1] 1
# [1] 1
答案 1 :(得分:0)
在您的循环中,尝试使用time<- time+1
..
time[t] <- t
在每次迭代中将time
增加1
时,以向量结束:
time
[1] 10 10 10 10 10 10 10 10 10 10
这是simout
中的最终输入。
simout$time
,如下所示:
2 2 2 2 ...
3 3 3 3 ...
...
10 10 10 ...
因此您应该在每次迭代中仅更改time
的特定元素。
现在(您可以从cat
)simout$time
看到它更改为:
1 1 1 1 ...
1 2 1 1 ...
1 2 3 1 ...
...
1 2 3 4 5 6 7 8 9 10 #this is the final input in "simout"