2016-07-13 28 views
1

Ich habe einen Vektor in der globalen Umgebung, und ich möchte eine Funktion erstellen, die nur ein Element dieses Vektors ändert. Das Problem ist, dass der Vektor zu groß ist und Standardmethoden zu lange brauchen, um sie zu berechnen. Siehe Funktionen, die ich bereits habe, beide sind zu langsam.Ändern Sie ein Element des globalen Vektors in einer Funktion

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 

Ich suche etwas wie folgt aus:

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

jederzeit x als Vektor abrufen Was mit dem dritten Befehl falsch ist? – Jimbou

+0

@Jimbou Ich brauche den Befehl innerhalb einer Funktion –

Antwort

1

Für mich Sie dies mit data.table Paket adressieren kann, wie es Gegenstand durch Bezugnahme manipuliert.

Zum Beispiel:

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 
... 

Sie können mit data[["x"]]

+0

Genau das, was ich gesucht habe. Vielen Dank –