我有两个列表,每个列表包含两个向量,即
x <- list(c(1,2),c(3,4))
y <- list(c(2,4),c(5,6))
z <- list(c(0,0),c(1,1), c(2,3),c(4,5))
我想使用for
循环来遍历第一个列表,并使用if
语句对第二个列表进行迭代,如下所示:
for (j in 1:seq(x)){
if(y[[j]] == c(2,4))
z[[j]] <- c(0,0)
}
我想迭代第一个列表,并且对于每次迭代,我想为第二个列表提供条件。我的功能很复杂,所以我上传了这个与我原来的功能类似的例子。这就是说,我想根据z
的值选择y
的值。对于x
,我只想根据x
的长度运行代码。
当我运行它时,我收到了这条消息:
Warning messages:
1: In 1:seq(x) : numerical expression has 2 elements: only the first used
2: In if (y[[j]] == c(2, 4)) y[[j]] <- c(0, 0) :
the condition has length > 1 and only the first element will be used
我搜索这个网站,我看到了类似的问题,但没有帮助(if loop inside a for loop which iterates over a list in R?)。这个问题仅仅是我的问题的第一部分。所以,它对我的问题没有帮助。
有什么帮助吗?
答案 0 :(得分:4)
第一个警告是由seq()
引起的,它[1] 1 2
与冒号运算符一起返回1:seq(x)
,在LHS和RHS之间创建一个序列。冒号左侧和右侧的值都必须为长度1.否则它将占用第一个元素并丢弃其余元素。因此1:1
与撰写if
第二个警告是y[[1]] == c(2, 4)
[1] TRUE TRUE
语句从你的条件中得到2个逻辑值:
all.equal
如果要测试向量的元素是否相同,可以使用符号。如果要测试向量是否相同,可以使用isTRUE(all.equal(y[[1]], c(2,4)))
[1] TRUE
。
TRUE
如果向量相等则返回FALSE
(如果不相等则返回isTRUE()
,这就是它需要与for (j in seq_along(x)){
if (isTRUE(all.equal(y[[j]], c(2,4)))) {
z[[j]] <- c(0,0)
}
}
一起使用的原因。)
要摆脱警告,你可以这样做:
seq_along()
注意:seq()
是Optional.ofNullable(request)
.map(Request::getBody)
.map(Body::getSections)
.orElse(Collections.emptyList())
.stream()
.filter(section -> "name".equals(section.getName))
.findFirst();