我正在学习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
包裹向量时,它返回length
1的list
,单位将是整个向量。R
中的for
循环是for each
循环,而不是传统的计数器控制的三部分表达式循环。因此,i
将是整个vetor
向量。
由于if/else
期望单个元素,而不是length
的向量大于1,因此会导致警告消息
或者,如果我们想将其与length
1的每个元素一起存储在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的答案,这可能会对您的有很大帮助