如何永久更改R中的向量?

如何永久更改R中的向量?,r,rating,R,Rating,我试图模拟一场比赛,在每一轮比赛中,从13名球员中随机选出两名球员,他们的相对技能水平的衡量标准得到更新。每个玩家都有一个真实的基本技能级别true.rating,在比赛期间,我会在每一轮更新当前等级后存储他们的等级,并将每次迭代存储在ratings.matrix中。这是我的代码,用R标记写的 true.ratings <- seq(from = -2, to = 2, length.out = 13) current.ratings <- seq(from = -2, to =

我试图模拟一场比赛,在每一轮比赛中,从13名球员中随机选出两名球员,他们的相对技能水平的衡量标准得到更新。每个玩家都有一个真实的基本技能级别true.rating,在比赛期间,我会在每一轮更新当前等级后存储他们的等级,并将每次迭代存储在ratings.matrix中。这是我的代码,用R标记写的

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的新手。欢迎任何关于如何改进的反馈:

R努力成为函数式语言,这意味着函数影响父环境的唯一方式是通过返回值。如果要更改属于函数外部某个环境的值,则需要使用R方法

通常的做法是:

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

您需要将环境本身作为参数传递给函数。这是R通过引用传递的方式。比如说


请注意,你也可以使用很多讨厌的东西,我不知道这和C++有什么关系。我不知道那个标签是如何在里面滑动的。谢谢,我把它取下来了。解释得很好。我试了这三个,他们都解决了问题。我将实施解决方案2。非常感谢@farnsy
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())