【问题标题】:How to iteratively update an variable with its previous value in R with vectorization?如何通过矢量化迭代更新变量及其在 R 中的先前值?
【发布时间】:2016-03-27 19:57:41
【问题描述】:

我有一段这样的 R 代码

s<-vector()
s[1]=1
for(i in 2:10){
   ds= 1/i/s[i-1]
   s[i]= s[i-1]+ds
 }
 s 

结果是:

 [1] 1.000000 1.500000 1.722222 1.867384 1.974485 2.058895 2.128281 2.187014
 [9] 2.237819 2.282505

以上是一个玩具示例,我正在尝试使用 s[i-1] 来更新 s[i],请帮我解决这个问题,我尝试了以下方法:

s<-vector()
s[1]<-1
sapply(2:10,FUN = function(i){
   if(i==1){
      return(s[i])
   }
   ds<-1/i/s[i-1]
   #print(paste(i,s_new,ds,ds+s[i-1]))
   s[i]= s[i-1]+ds
   return(s[i])
   }
)

以上方法无效

【问题讨论】:

  • 为什么不直接返回s[i-1]+dss[i] &lt;- s[i-1]+ds 的赋值只会在函数内部发生,而不是全局发生。
  • 有时您只需要使用for 循环。如果速度太慢,您可能不得不用 C++ 或 FORTRAN 重写。那有什么问题?有一些技巧可以帮助for 提高循环速度,例如预定义向量,而不是像第一个示例那样增长它们。
  • @TARehman 我试过你说的,但还是不行。
  • 对不起,我看到它时脑子里放了个屁。我现在明白了。你需要(我相信)&lt;&lt;-

标签: r vectorization apply lapply sapply


【解决方案1】:

我认为使用&lt;&lt;- 可以让你直接分配给s 的全局版本。这不是我经常做的事情。请参阅this question,了解环境如何在 R 中工作的详细信息。

我并不喜欢下面的版本,主要是因为它混合了 return() 和直接赋值 &lt;&lt;-。此时,您似乎还不如使用 cmets 中提到的循环。

s <- vector()
s[1] <- 1

sapply(2:10,FUN = function(i){

    if(i == 1){

        return(s[i])
    }
    ds <- 1/i/s[i - 1]
    s[i] <<- s[i - 1] + ds
    }
)

【讨论】:

  • 由于我尝试使用 S[i-1] 更新 S[i],因此我没有更好的解决方案。如果你能改变这一点,那将非常有帮助
  • 我很困惑。这个版本不做需要的吗? s[i] &lt;&lt;- ... 应该为您提供 s[i] 的更新版本。
  • 对不起,感谢您的 cmets,我认为您可以更改 S 的全局使用并提供此功能的更好版本。
  • 哦。我认为,正如 Spacedman 所说,你只需要在这里循环。我不确定您还能如何做到这一点,因为这些值依赖于以前的值。
猜你喜欢
  • 2021-04-12
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2020-03-03
  • 2020-07-05
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
相关资源
最近更新 更多