【问题标题】:How do I permanently change a vector in R?如何永久更改 R 中的向量?
【发布时间】:2017-03-19 00:22:09
【问题描述】:

我正在尝试模拟一场比赛,在每轮比赛中,从 13 场比赛中随机选择两名球员,他们的Elo rating(衡量他们的相对技能水平)得到更新。每个玩家都有一个真正的基础技能水平true.rating,在比赛期间,我在每轮比赛后存储他们的评分,我试图更新current.ratings,并将每次迭代存储在ratings.matrix。这是我的代码,用 R markdown 写的

true.ratings <- seq(from = -2, to = 2, length.out = 13)

current.ratings <- seq(from = -2, to = 2, length.out = 13)
ratings.matrix <- matrix(nrow = 13, ncol = 10000)


i.wins <- function(i, j, p) {
    i.wins <- rbinom(1, 1, p)
    return(i.wins)
}

update <- function (K, i, j) {
  R.i <- true.ratings[i]
  R.j <- true.ratings[j]
  probability_i.wins <- 1/(1 + exp(R.j - R.i))
  probability_j.wins <- 1 - probability_i.wins

  winner.is.i <- as.logical(i.wins(i, j, probability_i.wins))

  if (winner.is.i) {
    replace(current.ratings, i , current.ratings[i] + K*(1-probability_i.wins))
    replace(current.ratings, j,  current.ratings[j] -K*probability_j.wins)
  } 
 if (!winner.is.i) {
    current.ratings[i] <- current.ratings[i] -K*probability_i.wins
    current.ratings[j] <- current.ratings[j] + K*(1-probability_j.wins)
  }

  return(current.ratings)
}


match <- function(K) {
  ij <- sample(1:13, 2, replace = F)
  i <- ij[1]
  j <- ij[2]

  return(update(K, i, j))
}


tournament <- function(K) {

  current.ratings <- match(K)

  for (j in 1:10000) {
    ratings.matrix[, j] <- match(K)

  }
  return(ratings.matrix)
}


ratings.matrix <- tournament(K = 0.01)

评分方法在每轮比赛后更新,玩家i 和玩家j 在比赛结束后的当前评分。但是,当两个不同的玩家在下一轮比赛时,当前玩家 i 和 j 的评分将回到原来的true.rating 值。我怀疑这与我没有正确更新我的current.rating 矩阵向量有关。

这是我的第一个堆栈溢出帖子,我也是 R 新手。欢迎任何其他关于我如何改进的反馈:)

【问题讨论】:

  • 我看不出这与 C++ 有什么关系。
  • 我不知道那个标签是怎么溜进去的。我已经删除了,谢谢。

标签: r rating


【解决方案1】:

R 努力成为一种函数式语言,这意味着函数影响父环境中事物的唯一方式是通过返回值。如果你想改变一个属于函数之外某个环境的值,你需要用 R 的方式来做。

通常的做法:

  1. 返回 current.ratings 并在顶层显式覆盖它。换句话说,你的函数tournament() 需要返回一个包含current.ratingsratings.matrix 的列表,然后你需要在顶层环境中显式覆盖这两个变量(在你的函数调用之后)。

  2. 您需要将环境本身作为参数传递给函数。这是 R 的引用传递方式。例如

tournament <- function(K, myenv){
  myenv$current.ratings <- match(K)
    for (j in 1:10000) {
    ratings.matrix[, j] <- match(K) 
  }
  return(ratings.matrix)
} 
ratings.matrix <- tournament(K = 0.01, myenv=environment())

请注意,在您的情况下,您也可以使用令人讨厌的 &lt;&lt;- 超分配运算符,但我没有将其作为实际解决方案提及,因为我不想被任何烂番茄击中。

【讨论】:

  • 很好的解释。这三个我都试过了,他们都解决了这个问题。我将实施解决方案 2。非常感谢@farnsy
猜你喜欢
  • 2014-08-14
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多