我想在删除0长度的项目时提取R中的列表元素及其索引。假设我在R中有以下列表:
Graph graph = this.createGraph();
GraphTraversalSource g = graph.traversal();
this.server = new GremlinServer(getSettings());
this.server.getServerGremlinExecutor().getGraphManager().putGraph("graph", graph);
this.server.getServerGremlinExecutor().getGremlinExecutor().getGlobalBindings().put("graph", graph);
this.server.getServerGremlinExecutor().getGremlinExecutor().getGlobalBindings().put("g", g);
this.server.start();
然后l1 <- character(0)
l2 <- c("a","b")
l3 <- c("c","d","e")
list1 <- list(l1, l1, l2, l1, l3)
返回以下内容:
list1
我想以某种方式提取一个对象,该对象显示每个非空元素的索引/位置,以及该元素的内容。所以看起来像这样:
[[1]]
character(0)
[[2]]
character(0)
[[3]]
[1] "a" "b"
[[4]]
character(0)
[[5]]
[1] "c" "d" "e"
我最接近这样做的方法是删除空元素,但后来我丢失了其余元素的原始索引/位置:
[[3]]
[1] "a" "b"
[[5]]
[1] "c" "d" "e"
答案 0 :(得分:2)
keep
,将保留与谓词匹配的元素。 negate(is_empty)
创建一个函数,如果向量不为空,则返回TRUE
。
library("purrr")
names(list1) <- seq_along(list1)
keep(list1, negate(is_empty))
#> $`3`
#> [1] "a" "b"
#>
#> $`5`
#> [1] "c" "d" "e"
答案 1 :(得分:0)
保持索引要求我为列表中的每个元素命名。此答案使用which()
来设置我应用于list1
以保持非零长度元素的条件。
# load data
l1 <- character(0)
l2 <- c("a","b")
l3 <- c("c","d","e")
list1 <- list( l1, l1, l2, l1, l3)
# name each element in the list
names( list1 ) <- as.character( 1:length( list1 ) )
# create a condition that
# keeps only non zero length elements
# from list1
non.zero.length.elements <-
which( lapply( X = list1, FUN = length ) != 0 )
# apply the condition to list1
# to view the non zero length elements
list1[ non.zero.length.elements ]
# $`3`
# [1] "a" "b"
#
# $`5`
# [1] "c" "d" "e"
# end of script #
答案 2 :(得分:0)
我不确定“提取显示的对象”究竟是什么意思,但如果您只想打印,则可以使用此修改后的print
。
我只是略微编辑print.listof
(它不是递归的!将显示零长度子元素):
print2 <- function (x, ...)
{
nn <- names(x)
ll <- length(x)
if (length(nn) != ll)
nn <- paste0("[[", seq.int(ll),"]]")
for (i in seq_len(ll)[lengths(x)>0]) {
cat(nn[i], "\n")
print(x[[i]], ...)
cat("\n")
}
invisible(x)
}
print2(list1)
[[3]]
[1] "a" "b"
[[5]]
[1] "c" "d" "e"
答案 3 :(得分:0)
一个非常简单的解决方案是为列表中的元素提供名称,然后再次运行您的函数。有几种方法可以命名元素。
l1 <- character(0)
l2 <- c("a","b")
l3 <- c("c","d","e")
list1 <- list(e1=l1, e2=l1, e3=l2, e4=l1, e5=l3)
list1
names(list1)<-paste0("element",seq(length(list1)))
list1[lapply(list1, length) > 0]