私は入れ子になっていないリストを残しています。いくつかの要素はNAsですが、同じリストの他の要素で置き換えることができます。これは、グローバル代入演算子<<-
で実現できます。しかし、私はより良い練習を学ぼうとしています(これはCRANのパッケージをコンパイルするときに私にnotes
を与えるように見えます)。質問:リスト要素を置き換えます(グローバル割り当てを避けてください)
- グローバル割り当てなしでこれを達成できますか?
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のパッケージを構築するためのベストプラクティスものです。ここでは完全を期すためmatch(nulls, names(L1))
なぜあなたはそれをしないのですかベクトルをリストする? – Roland
'lapply' +' << - 'は通常、forループを使用しなければならないことを意味します。 – hadley
@hadley、有用な情報私はこれが私が私のパッケージのビルドで得ているノートのいくつかを取り除くことができると賭けています。 –