3

リストの要素が存在するかどうかを確認するにはどうすればよいですか。これはリストのリストなので、たとえば3番目の要素l1[[3]]が存在するかどうかを確認したいと思います。is.null(l1 [["3"]])を試しましたが、存在するかどうかに関係なくfalseが返され、is.null(l1 [[3]])を使用すると、下付き文字のエラーが発生します。存在しないがTRUEでない場合のバインドの。どのように私はチェする必要があります

4

3 に答える 3

6

tl; dr: 要素nが存在するかどうかを確認する場合は、リストの最後または空のリストを確認する場合でも、次を使用します。

length(mylist) >= n   # TRUE indicates exists. FALSE indicates DNE

ネストされたリストの場合は、正しいリストを確認してください。例えば:

 length(outerlist[[innerlist]]) >= n




RのリストのNULLには、他の言語で使用されているものとはいくつかの違いがあります。たとえば、リストの要素をNULLに置き換えると、後続のすべての要素がシフトオーバーされ、リストの長さが1つ短くなります。

# SAMPLE DATA
mylist <- as.list(LETTERS[1:5])

    [[1]]
    [1] "A"

    [[2]]
    [1] "B"

    [[3]]
    [1] "C"

    [[4]]
    [1] "D"

    [[5]]
    [1] "E"

要素3と6でNULLをテストします。私たちが探している情報ではありません。

is.null(mylist[[3]])
# FALSE

is.null(mylist[[6]])
# Error in mylist[[6]] : subscript out of bounds

代わりに、リストの長さを確認します。

length(mylist) >= 3  # TRUE
length(mylist) >= 5  # TRUE
length(mylist) >= 6  # FALSE

3番目の要素を削除します。「空のスロット」は保持されないことに注意してください。(つまり、要素4は要素3になります。)

mylist[[3]] <- NULL

  [[1]]
  [1] "A"

  [[2]]
  [1] "B"

  [[3]]
  [1] "D"

  [[4]]
  [1] "E"


length(mylist) >= 3  # TRUE
length(mylist) >= 5  # FALSE
length(mylist) >= 6  # FALSE

空のリストの長さは0になります

emptyList <- list()
length(emptyList)  # 0

nestedList <- list( letters=list("A", "B", "C"), empty=list(), words=list("Hello", "World"))

length(nestedList)
  # [1] 3
lapply(nestedList, length)
  # $letters
  # [1] 3
  #
  # $empty
  # [1] 0
  #
  # $words
  # [1] 2



NULLをリストに組み込むことができること に注意してください。これは、NULLのテストが適用可能な場合です。例えば:

myListWithNull <- list("A", "B", NULL, "D")

is.null(myListWithNull[[3]])
  # TRUE

length(myListWithNull) >= 3
  # TRUE
于 2012-12-07T14:51:49.400 に答える
1

ここに投稿したように、リスト全体の長さをチェックするのではなく、要素自体の長さをチェックしてNULL値をチェックすることができます。私の知る限り、NULLを除くすべての値の長さは0より大きくなっています。

x <- list(4, -1, NULL, NA, Inf, -Inf, NaN, T, x = 0, y = "", z = c(1,2,3))
lapply(x, function(el) print(length(el)))
[1] 1
[1] 1
[1] 0
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 3

したがって、名前付きインデックスと番号付きインデックスの両方で機能する単純な関数を作成できます。

element.exists <- function(var, element)
{
  tryCatch({
    if(length(var[[element]]) > -1)
      return(T)
  }, error = function(e) {
    return(F)
  })
}

要素が存在しない場合、tryCatchブロックによってキャッチされた範囲外の状態が発生します。

于 2018-05-26T02:09:25.347 に答える
1

ifのステートメントの評価は、条件がfalseになるとすぐに停止するため、以下を使用して、要素が空であるかどうかを確実に確認できます。

if(length(l1)<n || is.null(l1[[n]]){ # TRUE only if not NULL
}

または、名前付きリストを使用することもできます

is.null(l1[["a"]])

リストの長さに関係なく動作します。

于 2018-11-12T16:30:50.147 に答える