5

次のコードを検討してください。

b <- list(u=5,v=12)
c <- list(w=13)
a <- list(b,c)

したがって、 a は実際にはリストのリストです。a$b、またはを呼び出すとa$c、なぜ がNULL返されるのですか? 同様にa$u、 、a$v、またはを呼び出すとa$wNULLが返されます。

また、次の違いがあります。

c(list(a=1,b=2,c=list(d=5,e=9))) 

c(list(a=1,b=2,c=list(d=5,e=9)), recursive=T)
4

2 に答える 2

4

$索引付け演算子は、リストを名前索引付けします。名前のないリストから最初の要素を取得したい場合はaa[[1]].

名前が指定されていない場合は、名前が自動的に追加される関数を作成できます。これは、機能する方法と同様data.frameです (このバージョンはオール オア ナッシングです。いくつかの引数に名前が付けられている場合、残りの名前のないものには名前が付けられません)。

nlist <- function(...) {
    L <- list(...)
    if (!is.null(names(L))) return(L)
    n <- lapply(match.call(),deparse)[-1]
    setNames(L,n)
}

b <- c <- d <- 1

nlist(b,c,d)
nlist(d=b,b=c,c=d)

2 番目の質問については、答えは「はい」です。試してみましたか???

L <- list(a=1,b=2,c=list(d=5,e=9))
str(c(L)) 
## List of 3
##  $ a: num 1
##  $ b: num 2
##  $ c:List of 2
##   ..$ d: num 5
##   ..$ e: num 9
str(c(L,recursive=TRUE))
##  Named num [1:4] 1 2 5 9
##  - attr(*, "names")= chr [1:4] "a" "b" "c.d" "c.e"

1 つ目は 2 つの数値と 1 つのリストを含むリストで、2 つ目は名前付きの数値ベクトルにフラット化されています。

于 2013-01-02T14:29:00.790 に答える
3

質問の最初の部分については、R 言語定義ドキュメントにあります。

$ を使用した形式は、リストやペアリストなどの再帰オブジェクトに適用されます。インデックスとして文字列リテラルまたは記号のみを許可します。つまり、インデックスは計算できません。インデックスを見つけるために式を評価する必要がある場合は、x[[expr]] を使用します。

だからあなたはあなたを変えることができa <- list(b,c)ますa <- list(b=b,c=c)

 a$b =  a[['b']]   ## expression 
$u
[1] 5

$v
[1] 12

質問の 2 番目の部分では、たとえば、$演算子を適用して違いを確認できます。

> kk <- c(list(a=1,b=2,c=list(d=5,e=9)))              ## recursive objects
> hh <- c(list(a=1,b=2,c=list(d=5,e=9)), recursive=T) ## atomic objects
> kk$a
[1] 1
> hh$a
Error in hh$a : $ operator is invalid for atomic vectors

理由として、hh の ?c からベクトルを取得します。

recursive = TRUE の場合、関数はリスト (およびペアリスト) を再帰的に下降し、すべての要素を組み合わせてベクトルにします。

于 2013-01-02T14:50:07.057 に答える