2011-10-30 11 views
39

私はこの動作が奇妙であり、経験豊富なユーザーが自分の考えと回避策を共有したいと思っていました。Rのリスト要素にNULLを代入していますか?

sampleList <- list() 
d<- data.frame(x1=letters[1:10],x2=1:10,stringsAsFactors=FALSE) 
for(i in 1:nrow(d)) 
     sampleList[[i]] <- d$x1[i] 

print(sampleList[[1]]) 
print(sampleList[[2]]) 
print(sampleList[[3]]) 
print(length(sampleList)) 
sampleList[[2]] <- NULL 
print(length(sampleList)) 
print(sampleList[[2]]) 
print(sampleList[[3]]) 

リストの要素がシフトアップします:Rに以下のコードサンプルを実行するには 。 これは予想通りですが、リストの2つの要素をマージして1つをドロップする関数を実装しようとしています。私は基本的にそのリストのインデックスを失うか、NULLとして持っています。

私はそれにNULLを割り当てることができ、上記の動作を参照してください方法はありますか?

ありがとうございます。

+0

'あなたのケースを助けるunlist'か? –

+1

あなたはRを間違って使用しています - より多くのベクトル化を実装しようとしてください。そうしないと、コードは遅く、醜く直感的になりません。 – mbq

答えて

49

良い質問です。

チェックアウトR-FAQ:Rで

、xがリストは、X [i]がある場合< - NULLとX [I] < - NULLがxから指定された要素を削除します。これらのうちの最初のものはSと互換性がなく、ノーオペレーションではありません。 UPDATE

> t <- list(1,2,3,4) 
> t[[3]] <- NULL   # removing 3'd element (with following shifting) 
> t[2] <- list(NULL)  # setting 2'd element to NULL. 
> t 
[[1]] 
[2] 1 

[[2]] 
NULL 

[[3]] 
[3] 4 

:として

- ([I] <あなたがXを使用してNULLに要素を設定できることに注意してくださいリスト(NULL))

は、次の例を考えてみ著者はthe R Infernoのコメントには、NULLを扱うときにはもっと微妙な状況があります。注意して今

# x is some list(), now we want to process it. 
> for (i in 1:n) x[[i]] <- some_function(...) 

some_function()戻りNULL場合、あなたは多分あなたが欲しいものを得ることはありませんことを:コードのかなり一般的な構造を考えてみましょういくつかの要素は、ちょうどを消えます。むしろlapply機能を使用する必要があります。 このおもちゃの例を見てみましょう:

> initial <- list(1,2,3,4) 
> processed_by_for <- list(0,0,0,0) 
> processed_by_lapply <- list(0,0,0,0) 
> toy_function <- function(x) {if (x%%2==0) return(x) else return(NULL)} 
> for (i in 1:4) processed_by_for[[i]] <- toy_function(initial[[i]]) 
> processed_by_lapply <- lapply(initial, toy_function) 
> processed_by_for 
    [[1]] 
    [1] 0 

    [[2]] 
    [1] 2 

    [[3]] 
    NULL 

    [[4]] 
    [1] 4 

> processed_by_lapply 
    [[1]] 
    NULL 

    [[2]] 
    [1] 2 

    [[3]] 
    NULL 

    [[4]] 
    [1] 4 
+14

これは 'The Inferno'のCircle 8.1.55です。http://www.burns-stat.com/pages/Tutor/R_inferno.pdf Circle 8.1.56はこれより微妙なバージョンです。 –

+0

@Patric、あなたのコメントに応じて回答を更新しました。 – Max

+0

詳細な説明ありがとうございます。どのようにマニュアルを読んで、これらの微妙な点を見落とさないように!! – harshsinghal

5

あなたの質問は私にとってはちょっと混乱しています。

既存のオブジェクトにnullを割り当てると、そのオブジェクトが削除されます(これは、データフレームがあり、特定の列を削除したい場合に非常に便利です)。それはあなたがやったことです。私はそれがあなたが何を望んでいるかを判断することができません。あなたは代わりにNULLの

sampleList[[2]] <- NA 

試みることができるが、「私は失いたく」であれば、あなたがそれを削除する意味、あなたはすでに成功してきました。だからこそ、「リストの要素は上にシフトする」

0
obj = list(x = "Some Value") 
obj = c(obj,list(y=NULL)) #ADDING NEW VALUE 
obj['x'] = list(NULL) #SETTING EXISTING VALUE 
obj 
+1

これは受け入れられた回答とどのように異なっていますか? –

関連する問題