【问题标题】:Counter in an if/else statement using R?使用 R 在 if/else 语句中进行计数器?
【发布时间】:2013-01-22 19:04:16
【问题描述】:

我对 R 和一般编程比较陌生,我想知道是否有办法在我的 for 循环中的 if else 语句中放置一个计数器。我在 for 循环中有以下 if/else 语句:

if(runif(1)<min(1,r)) {
Gibbsalph[,t]=alphcandidate
} else{
Gibbsalph[,t]=Gibbsalph[,t-1]
}

有没有办法计算循环在进行迭代时选择“if”选项的次数(即 Gibbsalph[,t]=alphcandidate 的次数)?

非常感谢!

【问题讨论】:

  • 很棒的工作就像一个魅力!谢谢大家!

标签: r if-statement for-loop counter


【解决方案1】:

这可能很有用,因为它避免了创建全局变量 i。见Examples of the perils of globals in R and Stata

init.counter <- function(){
  x <- 0
  function(){
    x <<- x + 1
    x
   }
}  #source: hadley wickham

> counter1 <- init.counter()
> 
> counter1()
[1] 1
> counter1()
[1] 2
> 

在不迭代的情况下访问计数器的值:

environment(counter1)$x

所以它最终会是:

counter2 <- init.counter()
if(runif(1)<min(1,r)) {
counter2()
Gibbsalph[,t]=alphcandidate
} else{
Gibbsalph[,t]=Gibbsalph[,t-1]
}
environment(counter2)$x

【讨论】:

  • 感谢您花时间写这篇文章,这太棒了。您发布的链接对我也有帮助。在我进行进一步的编程时,我一定会考虑到这一点!
  • 很好地使用了词法闭包。
【解决方案2】:

这是你现在得到的:

if(runif(1)<min(1,r))

假设您的循环结束了序列 jj = 1:t ,那么:

alltests <- runif(t) < min(1,r)  #vector of TRUE, FALSE
wincount <- sum(alltests)

在循环内部,

Gibbsalph[,t] <- alphcandidate * alltests[jj] + Gibbsalph[,t-1]*(!alltests[jj])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2020-09-06
    • 2016-11-13
    • 2018-06-29
    • 1970-01-01
    • 2018-02-28
    相关资源
    最近更新 更多