6

ネストされていないリストを作成しました(非常に簡単です)。一部の要素はNAですが、同じリストの他の要素に置き換えることができます。これは、グローバル代入演算子を使用して実現でき<<-ます。しかし、私はより良い練習を学ぼうとしています(これはnotes、CRANのパッケージをコンパイルするときに私に与えられるようです)。質問:

  1. グローバルな割り当てなしでこれを達成できますか?
  2. そうでない場合、どのようにassign適切に使用できますか(私のアプローチでは、同じデータセットのコピーが大量に作成されるようで、メモリの問題が発生する可能性があります)。

割り当てを試しましたが、機能しません。また、グローバル割り当てなしで使用しようとしましlapplyたが、各要素が置き換えられたリストではなく、最後の要素のみが返されます。

ここに問題があります:

#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)
})  

最終的には、グローバルな割り当てなしでこれを実行したいと思いますが、そうでない場合は、パッケージのCRANビルドのベストプラクティスです。

4

2 に答える 2

10

あなたのreplaceためにこれを行う関数があります:

replace(L1, match(nulls, names(L1)), L1[match(replaces, names(L1))])

which(is.na(L1))代わりに、少し単純なを使用することもできますmatch(nulls, names(L1))

于 2013-01-14T15:47:18.723 に答える
4

完全を期すために、いくつかの同様の状況では使用できないため、ハドリーによるforループの提案がありますreplace

for(i in seq_along(a[!apps])){
    L1[[nulls[i]]] <- L1[[replaces[i]]]
}
于 2013-01-16T17:52:49.197 に答える