【问题标题】:R: Loop using different functions depending on previous outputR:根据先前的输出使用不同的函数循环
【发布时间】: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] &lt;- ifelse (yresult[i-1]&lt;5,linfunct1(i),linfunct2(i))} 不会在 yresult &lt;- NULL 时运行

标签: r for-loop if-statement iteration


【解决方案1】:

你的函数需要返回一个值:

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 对象。

【讨论】:

  • 非常感谢!我试图用你的建议更新我的函数 - 它在几个时间点上运行良好,然后发生了一些奇怪的事情:值减少但每个视图时间点它“跳跃”到一个更高的值,然后它会减少。这些是我在结果中得到的前 10 个值: Time Results 0 0.0 1 1.0 2 2.5 3 4.5 4 7.0 5 6.4 6 5.7 7 4.9 8 9.4 9 8.4 10 7.3 另外,我在上面的问题中添加了更多信息,也许是这个有帮助吗?
  • 我很抱歉评论的样子。我希望你能弄清楚这种“数据框”。首先是时间点,然后是价值。第一次“跳跃”发生在时间点 7 和 8 之间,从 4.9 到 9.4,之后再次下降。
  • 你能用你的新代码更新你的问题吗,你期望什么结果,你得到的结果?
  • 再次感谢,我已经进行了第二次更新,希望能澄清这一点。
  • 我认为您现在正在寻求算法方面的帮助,而不是 R 代码方面的帮助。如果您在设计产生所需输出的算法时需要帮助,可以考虑提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多