r-如何验证for循环中的条件



我正在学习R端数据科学。在一个问题中,我需要验证数组中的数字是否为偶数。

我的代码:

vetor <- list(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
for (i in vetor) {
if (i %% 2 == 0) {
print(i)
} 
}

但结果是一个警告信息:

Warning message:
In if (i%%2 == 0) { :
a condição tem comprimento > 1 e somente o primeiro elemento será usado

翻译:

条件的长度>1,并且将仅使用第一个元素

我需要的是,验证列表中的每个元素是否为偶数,如果为true,则打印它

在R中,我该怎么做?

list的包装器不需要

vetor <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

运行OP的代码

for (i in vetor) {
if (i %% 2 == 0) {
print(i)
} 
}
#[1] 2
#[1] 4
#[1] 6
#[1] 8
#[1] 10

这些是矢量化操作。我们不需要环路

vetor[vetor %% 2 == 0]
#[1]  2  4  6  8 10

当我们用list包裹向量时,它返回length1的list,单位将是整个向量。R中的for循环是for each循环,而不是传统的计数器控制的三部分表达式循环。因此,i将是整个vetor向量。

由于if/else期望单个元素,而不是length的向量大于1,因此会导致警告消息

或者,如果我们想将其与length1的每个元素一起存储在list中,请使用as.list

vetor <- as.list(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

让我们分解您的代码,深入了解每一步,看看发生了什么。。。


您应该注意到vetor是一个列表,即

> vetor
[[1]]
[1]  1  2  3  4  5  6  7  8  9 10

在这种情况下,迭代器i in vetor表示vetor中的数组,从中可以看出

> for (i in vetor) {
+   str(i)
+ }
num [1:10] 1 2 3 4 5 6 7 8 9 10

因此,当您有条件i%%2==0时,您确实在运行

> for (i in vetor) {
+   print(i %% 2 == 0)
+ }
[1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE

其不是作为CCD_ 19状态的条件的单个逻辑值。这就是你收到警告的原因。


关于解决方法,您可以参考@akrun的答案,这可能会对您的有很大帮助

最新更新