在函数中更改全局向量的元素

Change an element of global vector in a function

我在全局环境中有一个向量,我想创建一个只修改该向量的一个元素的函数。问题是向量太大,标准方法计算时间太长。看看我已经有的功能,两个都太慢了

x <- rep(0, 1e8)
f1 <- function(n,a) {
  x <- x      # loads the vector to current environment
  x[n] <- a   # changes the position in current environment
  x <<- x     # saves the vector to global environment
}
f2 <- function(n,a) {
  x[n] <<- a  # changes the vector element in global environment
}

system.time(f1(1,1))   # 0.34
system.time(f2(2,1))   # 0.30
system.time(x[3] <- 1) # 0.00

我正在寻找这样的东西:

assign('x[4]', 1, .GlobalEnv)

对我来说,您可以使用 data.table 包解决这个问题,因为它通过引用操作对象。

例如:

library(data.table)
data <- data.table(x=rep(0, 1e8))

f3 <- function(n,a){ 
  data[n,x:=a]
  return(TRUE)  
}

system.time(f3(2,1))   # 0
print(data)
x
1: 0
2: 1
3: 0
4: 0
...

您可以随时使用 data[["x"]]

检索 x 作为矢量