【发布时间】:2020-08-25 15:40:31
【问题描述】:
我正在 R-bloggers 网站上进行 R 练习。这是我正在解决的问题:
如果给定的整数在向量内,则创建一个返回 TRUE 的函数。
提供的解决方案代码为:
f.exists <- function (v, x) {
exist <- FALSE
i <- 1
while (i <= length (v) & !exist) {
if (v[i] == x) {
exist <- TRUE
}
i <- 1 + i
}
exist
}
但是,我的尝试是:
isInside <- function(x, y) {
i <- 1
for (i in x) {
print(i)
if (x[i] == y) {
return(TRUE)
}
else {
return(FALSE)
}
}
}
test <- c(1,2,3,4,5,6,7,8,9,10,10.25,100)
isInside(test,10.25)
这会返回[1] 1 [1] False,这意味着它只循环了一次,一旦命中假就退出。但它应该返回 true,因为 10.25 在向量 x 中。我不确定为什么if 语句不起作用,因为它应该循环遍历x 的每个索引以查看数字是否在向量中。
另外,我在this post 上发现,说你应该使用while 循环而不是for 循环。为什么for 循环如此糟糕的做法?我的for 循环是否存在固有问题使其无法正常工作?
【问题讨论】:
-
(你是否意识到
return突破了任何for、while、repeat或其他任何东西?它会立即转义函数。) -
(很抱歉将新的尝试粘贴为评论,认为将其放在我的原始帖子中不合适。)@r2evans
-
如果您想在找到匹配项时返回 true,那么可能只需要
if (x[i] == y) return(TRUE)而在x[i] != y时什么也不做。这样,循环将进入下一次迭代并重试。循环完成后,您可能应该return(FALSE),因为代码执行在函数中到达该点的唯一方法是比较整个向量并且没有任何内容导致立即返回。 -
另外,
i是x的一个元素,而不是它的索引,所以x[i]是不合适的。 (并且没有必要预先实例化i <- 1,因为for循环会为您处理这个问题。) -
也许是
function(x, y) { for (el in x) if (el == y) return(TRUE) ; return(FALSE); }。 (不过,这个讨论完全是学术性的,因为希望有人更喜欢使用any(x %in% y)。)
标签: r