R:为什么这不被认为是有效的“如果”条件?

时间:2016-11-26 11:50:54

标签: r

我想构建一个函数,首先验证输入的向量是否只包含三个字符"p", "s", "r"(任何数字或顺序)。 我尝试了各种迭代:

  if (any (vec) != c("r", "p", "s")) {stop ("Inputs have to be rock, paper and scissors.")}

就像用|分隔条件,但即使只有一个字母的条件,返回:

Error in if (any(vec) != c("r", "p", "s")) { : 
  missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In any(vec) : coercing argument of type 'character' to logical
2: In if (any(vec) != c("r", "p", "s")) { :
  the condition has length > 1 and only the first element will be used

喜欢弄清楚为什么R不会将此视为具有真/假的合法条件。

2 个答案:

答案 0 :(得分:4)

原因是条件返回长度大于1的逻辑向量,if/else长度为1,将条件更改为如下所示,它将起作用

if(!any(vec %in% c("r", "p", "s"))) {
      stop ("Inputs have to be rock, paper and scissors.")}
#Error: Inputs have to be rock, paper and scissors.

数据

vec <- c("a", "b")

答案 1 :(得分:1)

简答:

在if语句中,您将any(vec)与字符向量c("r", "p", "s")进行比较。您似乎打算在比较后使用any函数(即只需观察括号)。像这样的东西很容易解决,可能就是你想要的:

if (any (vec != c("r", "p", "s"))) {stop ("Inputs have to be rock, paper and scissors.")}

查看错误消息:

any是一个接受逻辑(即TRUEFALSE)输入的函数,并返回逻辑输出(如果输入的任何元素,则返回TRUE向量为TRUE,否则为FALSE)。

第一条警告消息是因为vec是字符,但由于R期望any的逻辑输入,它会尝试将您的字符向量转换(或强制)为逻辑向量(相当于做any(as.logical(vec)))。这种从字符到逻辑的强制产生NA,因为没有自然的方法可以做到这一点。

在第一次警告后,R评估了any(vec),然后您评估NA != c("r", "p", "s")。这会产生NA NA NA,而if语句需要长度为1的逻辑输入;这是你的第二个警告--R告诉你它只会看到三个元素中的第一个。

产生错误是因为您最终得到if(NA)NA不是TRUEFALSE,并且无法强制进入。粗略地说,这是R评估你的代码时会发生什么。

if (any (vec) != c("r", "p", "s"))  #Original: Throws warning 1
if (NA != c("r", "p", "s"))         #Next
if (c(NA, NA, NA))                  #Throws warning 2
if (NA)                             #Throws error