我想检查一个名为“answer的列表,如果它包含FALSE元素,然后返回一个布尔值(F),如果没有任何FALSE元素,换句话说都是TRUE,返回一个布尔值(T) 这是代码(不是太多行,但我不知道更简单的代码)
>answer=c(TRUE,FALSE,FALSE)
>l=length(answer)
>ind <- 1
>t=0
>f=0
>while(ind<(length(answer)+1)){
>ifelse(answer[ind]==TRUE,t<-t+1,f<-f+1)
>ind<-ind+1
>}
>ifelse(f>0,print("False"),print("True"))
这部分代码可以给我正确的结果。但它给了我两次!! 像这样:
[1] "True"
[1] "True"
为什么要给我两次......请帮助我,我不想使用这个功能那么多行
答案 0 :(得分:1)
您获得两次打印的原因是ifelse(f>0,print("False"),print("True"))
将首先评估f>0
(这是正确的),然后评估print("False")
(这将导致&#34; False&# 34;打印到控制台),最后ifelse将返回print("False")
(&#34; False&#34;)的值,然后将其自动打印到控制台(第二次打印)。 / p>
要绕过双面打印,您可以用
替换最后一行> ifelse(f>0,"False","True")
但请注意,此代码或代码都没有返回布尔值,它们都返回字符串。如果你想要一个布尔值,你应该使用
> ifelse(f>0,FALSE,TRUE)
然而,可以采取一些措施来改进此代码。您可以使用for循环直接遍历answer
向量(不需要ind
变量。更好的是,您可以使用R允许您添加两个值的事实布尔值(TRUE = 1,FALSE = 0),因此sum(answer)
将为您提供向量中的TRUE值。
解决这个问题的最简单方法是执行baptiste暗示all(answer)
将评估为TRUE,如果答案只包含TRUE值,这似乎是你想要的。