Попытка найти наименьшее значение вектора - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь найти наименьшее значение векторов с помощью функции, и когда я пытаюсь запустить ее, первый вектор работает нормально, а второй дает -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))

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Похоже, @mickey ответил на ваш немедленный вопрос, но сейчас хорошее время, чтобы еще раз подчеркнуть важность использования сильных сторон языка программирования. В этом случае R имеет встроенную функцию min(), которая работает сразу на весь вектор. Как показано в примере ниже, он почти в 30 раз быстрее, чем цикл for для вектора длины 1e8, который на самом деле не такой большой:

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

Создано в 2019-01-22 пакетом Представить (v0.2.1)

0 голосов
/ 23 января 2019

Вы можете сделать это с помощью 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...