如果元素的外观是有条件的,如何在 R 中获取命名列表元素?

How to get a named list element in R if the appearance of the element is conditional?

我想在 R 中的列表 L 中包含一个列表元素 c 并将其命名为 C。 示例如下:

a=c(1,2,3)
b=c("a","b","c")
c=rnorm(3)
L<-list(A=a,
        B=b,
        C=c)
print(L)

## $A
## [1] 1 2 3
## 
## $B
## [1] "a" "b" "c"
## 
## $C
## [1] -2.2398424  0.9561929 -0.6172520

现在我想在C上引入一个条件,所以它只包含在 列表如果 C.bool==T:

C.bool<-T
L<-list(A=a,
        B=b,
        if(C.bool) C=c)

print(L)

## $A
## [1] 1 2 3
## 
## $B
## [1] "a" "b" "c"
## 
## [[3]]
## [1] -2.2398424  0.9561929 -0.6172520

但是,现在 c 的列表元素未按照指定的方式命名 列表语句。这里有什么技巧?

编辑:目的是仅在满足条件时才将元素包含在列表中(否则不应包含 NULL)。这可以在列表的核心定义内完成吗?

如果你想保留名字可以试试这个

L2 <-list(A=a,
        B=b,
        C = if (TRUE) c)

你当然可以用包含C.bool

的语句替换TRUE

您可以将 if 语句放在列表的核心定义之外,如下所示:

L <- list(A = a, B=  b) 
if (isTRUE(C.bool)) L$C <- c
#> L
#$A
#[1] 1 2 3
#
#$B
#[1] "a" "b" "c"
#
#$C
#[1] -0.7631459  0.7353929 -0.2085646

(由于@DavidArenburg 的评论,用 isTRUE() 编辑)

我不知道你为什么要这样做 "without adding C outside the core definition of the list?" 但如果你对一个 c 中的两个 list 感到满意,那么:

L <- c(list(A=a, B=b), if(C.bool) list(C=c))

如果你真的想要一个list但不介意在创建后进行子集化那么

L <- list(A=a, B=b, C=if(C.bool) c)[c(TRUE, TRUE, C.bool)]

(David Arenburg 的步伐,isTRUE() 为简洁起见省略)

作为@MamounBenghezal、@user20637 先前答案的组合 和@DavidArenburg 的评论,我建议这个概括 不依赖列表长度的版本:

L <- Filter(Negate(is.null),
       x = list(A = a, B = b, C = if (isTRUE(C.bool)) c, D = "foo"))