我是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,所以我认为它也适用于新代码 我想改变基于时间的&#34;代码,以便函数的斜率取决于我的最后结果,而不是时间点,但我无法弄清楚如何做到这一点。
UPDATE2:
我已使用以下建议更新了我的代码:
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
答案 0 :(得分:0)
您的函数需要返回一个值:
linfunct1 <- function (i, m) {
m=0.5
if (i<=1) {
y=0
} else {
y=m*i+yresult[i-1]
}
y # returning this value
}
这适合你吗?
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
对象。