R:根据以前的输出使用不同的功能循环

时间:2017-04-17 05:55:56

标签: r for-loop if-statement iteration

我是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

1 个答案:

答案 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")

enter image description here

更新:您说得对,您的功能可以访问yresult对象。