2013-01-14 3 views
6

私は入れ子になっていないリストを残しています。いくつかの要素はNAsですが、同じリストの他の要素で置き換えることができます。これは、グローバル代入演算子<<-で実現できます。しかし、私はより良い練習を学ぼうとしています(これはCRANのパッケージをコンパイルするときに私にnotesを与えるように見えます)。質問:リスト要素を置き換えます(グローバル割り当てを避けてください)

  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のパッケージを構築するためのベストプラクティスものです。ここでは完全を期すためmatch(nulls, names(L1))

+1

なぜあなたはそれをしないのですかベクトルをリストする? – Roland

+1

'lapply' +' << - 'は通常、forループを使用しなければならないことを意味します。 – hadley

+0

@hadley、有用な情報私はこれが私が私のパッケージのビルドで得ているノートのいくつかを取り除くことができると賭けています。 –

答えて

10

がありますあなたのためにこれを行いますreplace機能です状況によっては使用できない場合がありますreplace

for(i in seq_along(a[!apps])){ 
    L1[[nulls[i]]] <- L1[[replaces[i]]] 
} 
4

するのではなく、

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

あなたはまた、which(is.na(L1))少し単純に使用することができ、いくつかの類似したように、ループのためのハドレーの提案です:

関連する問題