我试图用一个函数找到向量的最小值,当我尝试运行它时,第一个向量工作正常,而第二个给出-5而不是-7。
my_min <- function(x){
x.min<-x[1]
for (i in 0:length(x)){}
if (x[i]<x.min)
{
x.min<-x[i]
}
return(x.min)
}
my_min(c(5,4,7,5,3,2))
my_min(-c(5,4,7,5,3,2))
答案 0 :(得分:5)
您可以使用min
来做到这一点,但是{}
循环上的括号for
只是一个问题:
my_min <- function(x){
x.min <- x[1]
for (i in 1:length(x)){
if (x[i] < x.min)
{
x.min <- x[i]
}
}
return(x.min)
}
my_min(c(5,4,7,5,3,2))
my_min(-c(5,4,7,5,3,2))
您实际上并没有遍历任何内容。另外,R从1开始索引。
答案 1 :(得分:3)
看起来像@mickey回答了您的紧迫问题,但这是重申利用编程语言优势的重要时机。在这种情况下,R具有内置的min()
函数,该函数可一次对整个矢量进行运算。如下例所示,对于长度为1e8
的向量来说,它比for循环快近30倍,而实际上并没有那么大:
my_min <- function(x){
x.min <- x[1]
for (i in 1:length(x)){
if (x[i] < x.min)
{
x.min <- x[i]
}
}
return(x.min)
}
set.seed(42)
vec <- rnorm(1e8)
system.time(my_min(vec))
#> user system elapsed
#> 5.81 0.00 5.94
system.time(min(vec))
#> user system elapsed
#> 0.2 0.0 0.2
由reprex package(v0.2.1)于2019-01-22创建