R 查找给定元素的索引,如果给定元素未出现,则查找NA
我在一个问题上被困了好几个小时。如果你们有谁知道如何解决这个问题,非常感谢 所以我试图学习如何编写一个函数f,它接受一个输入(数字)向量“vec”和一个整数“int” 基本上,函数应该返回“int”在“vec”中出现的位置,如果“int”在“vec”中没有出现,那么函数应该返回“NA” 所有这些都是通过使用循环“for”实现的 最后,输出R 查找给定元素的索引,如果给定元素未出现,则查找NA,r,function,R,Function,我在一个问题上被困了好几个小时。如果你们有谁知道如何解决这个问题,非常感谢 所以我试图学习如何编写一个函数f,它接受一个输入(数字)向量“vec”和一个整数“int” 基本上,函数应该返回“int”在“vec”中出现的位置,如果“int”在“vec”中没有出现,那么函数应该返回“NA” 所有这些都是通过使用循环“for”实现的 最后,输出 sapply(1:4, function(x) print(f3(c(3, 3, 3, 2, 2, 1), x))) is # ``` # [1
sapply(1:4, function(x) print(f3(c(3, 3, 3, 2, 2, 1), x))) is
# ```
# [1] 6
# [1] 4 5
# [1] 1 2 3
# NULL
这是我的代码,但我被困在这里,看不到问题的解决方案
f <- function(vec, int) {
for (i in vec)
check <- vec[]== int
which(int == vec)
}
f您可以使用以下内容:
f <- function(vec, int){
if(all(vec != int)) return(NA)
for(i in vec){
if(i == int) return(which(vec == i))
}
}
f您所描述的本质上是已经做过的事情。唯一的区别是,它在没有命中的情况下返回整数(0)
(即空向量),而不是NA
因此,在f
中,您只需调用,然后“修复”结果:
f = function (vec, x) {
result = which(vec, x)
if (length(result) == 0L) NA_integer_ else result
}
代码if(length(…)==0L)èA›elseèB›
是一种常见的模式,人们通常为其定义一个特定的运算符:
`%||%` = function (a, b) {
if (length(a) == 0L) b else a
}
使用该功能,您可以大大简化f
(以及类似的功能):
f = function (vec, x) {
which(vec, x) %||% NA_integer_
}
编写的代码没有任何意义:你在vec
上循环,但你总是在循环的第一次迭代中返回,所以循环什么也不做(除了在vec
为空时被完全跳过)。很好,我真的好几个小时都看不到问题的解决方案。非常感谢你的帮助(:@Konrad对代码的看法是正确的。我刚刚更正了它。修复程序改进了一些东西,但我仍然认为代码没有任何意义。它不就是做了与相同的事情吗(vec==int)
,除了返回NA
而不是整数(0
当没有命中时?for
的循环只是多余的。@KonradRudolph,是的,正如你所说的for
循环没有多大意义。但是,最初的问题要求它。
f = function (vec, x) {
which(vec, x) %||% NA_integer_
}