如果元素的外观是有条件的,如何在 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"))
我想在 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"))