【发布时间】:2017-09-12 17:49:09
【问题描述】:
我是 R 新手,并且已经做了很多类似问题的搜索,但找不到任何可以帮助我的问题。 我正在尝试在 R 中编写应该执行以下操作的代码: 我有 100 个时间点的时间范围。我想使用循环将每个时间点放入线性函数中,检索输出,将其存储到向量中,然后将最后一个输出用于下一个时间点。 第一个函数表示线性增加。我希望算法使用第一个函数,直到达到某个阈值输出(yresult=5),在此之后,应该使用线性减少的第二个函数。 我已经编写了以下代码,但不知何故它似乎不起作用 - 它在 yresult 中不存储任何值,然后绘图显然失败。 任何帮助将不胜感激!
tt<-seq(from = 0, to = 100, by = 1)
tt_l <-length(tt)
yresult<-NULL
linfunct1 <- function (i, m) {
m=0.5
if (i<=1) y=0 else
y=m*i+yresult[i-1]}
linfunct2 <- function (i, m) {
m=-0.1
if (i<=1) y=0 else
y=m*i+yresult[i-1]}
for (i in 1:tt_l) {
yresult [i] <- ifelse (yresult[i-1]<5,linfunct1(i),linfunct2(i))}
results <-data.frame("Time"=tt, "Results"=yresult)
plot(yresult~tt, col="red")
更新:
我之前成功写过一个代码,其中线性函数的斜率根据某个时间点(第i个tt的入口)而变化。 图书馆(dplyr) 图书馆(plyr) 库(ggplot2)
tt<-seq(from = 1, to = 10, by = 1)
tt_l <-length(tt)
yresult<-NULL
linfunct <- function (i, m) {
if (i<5) m=0.5 else m=-0.5
if (i==1) y=0 else
y=m*i+yresult[i-1]}
for (i in 1:tt_l) {
yresult[i]=linfunct(i)}
results <-data.frame("Time"=tt, "Results"=yresult)
plot(yresult~tt, col="red")
在这段代码中,可以访问 yresult,所以我认为它也应该在新代码中工作。
我想更改“基于时间”的代码,以便函数的斜率取决于我最后的结果而不是时间点,但我不知道该怎么做。
更新2:
我已根据以下建议更新了我的代码:
tt<-seq(from = 0, to = 100, by = 1)
tt_l <-length(tt)
yresult <- rep(0, tt_l)
linfunct1 <- function (i, m=0.5) {
m=0.5
if (i<=1) {
y=0
} else {
y=m*i+yresult[i-1]
}
y
}
linfunct2 <- function (i, m=-0.1) {
m=-0.1
if (i<=1) {
y=0
} else {
y=m*i+yresult[i-1]
}
y
}
for (i in 2:tt_l) {
yresult[i] <- ifelse(yresult[i-1]<5, linfunct1(i=i), linfunct2(i=i) )
}
results <-data.frame("Time"=tt, "Results"=yresult)
plot(yresult~tt, col="red")
我希望 yresult 的输出会增加,直到变为 5,然后不断减少。 像这样:graph from code depending on tt 我得到的是 yresult 的输出,它增加直到 i=5,然后减少直到 yresult 低于 5,然后跳到更高的值并再次减少直到 yresult 低于 5。然后跳到更高的值和等等。 像这样:graph I get from code of second update
【问题讨论】:
-
for (i in 1:tt_l) {yresult [i] <- ifelse (yresult[i-1]<5,linfunct1(i),linfunct2(i))}不会在yresult <- NULL时运行
标签: r for-loop if-statement iteration