Liste ersetzen-Elemente (Vermeidung der globalen Zuweisung)

Ich lave eine nicht verschachtelte Liste (ziemlich straight-forward). Einige Elemente sind NAs, kann aber ersetzt werden mit anderen Elementen aus der gleichen Liste. Kann ich erreichen, das mit den globalen assignment-operator <<-. Aber ich versuche zu lernen, besser der Praxis (Wie dies scheint mir notes bei der Kompilierung ein Paket für CRAN). Fragen:

  1. Kann ich das erreichen, ohne eine Globale Aufgabe?
  2. Wenn nicht, wie kann ich assign angemessen (mein Ansatz scheint, um eine Reihe von Kopien der gleichen Daten eingegeben und ausführen in den Speicher-Probleme).

Ich habe versucht, zuweisen und es funktioniert nicht. Ich habe auch versucht zu verwenden lapply ohne Globale Belegung, aber ich kann nur das Letzte element zurückgegeben, anstatt die Liste mit jedem element ersetzt.

Hier ist das problem:

#Fake Data
L1 <- lapply(1:3, function(i) rnorm(1))
L1[4:5] <- NA
names(L1) <- letters[1:5]

#items to replace and their replacements (names of elements to replace)
nulls <- names(L1[sapply(L1, function(x) is.na(x))])
replaces <- c("b", "a")

#doesn't work (returns only last element)
lapply(seq_along(nulls), function(i) {
    L1[[nulls[i]]] <- L1[[replaces[i]]]
    return(L1)
})

#works but considered bad practice by many
lapply(seq_along(nulls), function(i) {
    L1[[nulls[i]]] <<- L1[[replaces[i]]]
})

#does not work (I try L1[["d"]] and still get NA)
lapply(seq_along(nulls), function(i) {
    assign(paste0("L1[[", nulls[i], "]]"), L1[[replaces[i]]], envir = .GlobalEnv)
})

#also bad practice bu I tried
lapply(seq_along(nulls), function(i) {
    assign(paste0("L1$", nulls[i]), L1[[replaces[i]]], envir = .GlobalEnv)
})

#This works but it feels like we're making a ton of copies of the same data set
lapply(seq_along(nulls), function(i) {
    L1[[nulls[i]]] <- L1[[replaces[i]]]
    assign("L1", L1, envir = .GlobalEnv)
})  

Letztlich möchte ich dies tun, ohne die Globale Zuweisung, aber wenn nicht, was ist die beste Praxis für einen KRAN bauen eines Pakets.

  • Warum gehst du nicht machen, dass die Liste einen Vektor?
  • lapply + <<- in der Regel bedeutet, Sie sollte mit einer for-Schleife.
  • hilfreiche info. Ich Wette, das könnte loszuwerden, einige der Notizen, die ich bin immer auf mein Paket zu bauen.
  • Es gibt sehr wenige Situationen, in denen Sie benötigen, zu verwenden <<-. Referenz-Klassen sind eins. stackoverflow.com/questions/14302629 ist eine andere.
InformationsquelleAutor Tyler Rinker | 2013-01-14
Schreibe einen Kommentar