我想构建一个函数,首先验证输入的向量是否只包含三个字符"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不会将此视为具有真/假的合法条件。
答案 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
是一个接受逻辑(即TRUE
或FALSE
)输入的函数,并返回逻辑输出(如果输入的任何元素,则返回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
不是TRUE
或FALSE
,并且无法强制进入。粗略地说,这是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