Как написать функцию, содержащую 'for' l oop, которая использует другую функцию внутри? Применяя эту функцию к векторам? - PullRequest
1 голос
/ 06 февраля 2020

Я думаю, что неправильно понимаю некоторую фундаментальную часть того, как работают циклы и функции for. Эта функция:

  even.odd <- function(x) {
  if (x != round(x)) {
    y <- NA
  } else if (x %% 2 == 0) {
    y <- "even"
  } else {
    y <- "odd"
  } 
  return(y)
}

работает отлично, возвращая "четные", "нечетные" или "NA" с заданным числом. Однако мне даны два вектора:

test1 <- c(-1, 0, 2, 5)
test2 <- c(0, 2.7, 9.1)

и мне нужно создать 'for' l oop, содержащую функцию even.odd, и протестировать ее с использованием этих векторов. Я прочитал все рекомендуемые примечания к чтению / лекции и часами безуспешно пытался получить желаемый результат, используя пустые векторы, индексируя новые объекты, просто помещая even.odd (num.ve c). Я не уверен, где я ошибся.

Нам дали отправную точку для новой функции:

even.odd.vec <- function(num.vec) {
#write your code here 
}

До сих пор я придумал:

  #creating intermediate function 
intermediate <- function(num.vec) {
      if (even.odd(num.vec) == "odd") {
        return("odd")
      } else if(even.odd(num.vec) == "even") {
        return("even")
      } else ifelse(is.na(num.vec), NA, "False")
    }

#creating new desired function
    even.odd.vec <- function(num.vec) {
      for (i in seq_along(num.vec)) {
       intermediate(num.vec)
      print(intermediate(num.vec))
      }
    }

Промежуточная функция была В результате я столкнулся с различными ошибками при попытке создать более простое тело для even.odd.ve c. Но теперь, когда я пытаюсь использовать even.odd.ve c с одним из тестовых векторов, я получаю эту ошибку:

условие имеет длину> 1, и будет использоваться только первый элемент. имеет длину> 1, и будет использоваться только первый элемент; условие будет иметь длину> 1, будет использоваться только первый элемент; условие имеет длину> 1, и будет использоваться только первый элемент

Я очень застрял в этой точке и хотел узнать, как сделать что-то подобное этой работе. Мне было очень весело работать над этим, но я думаю, что копаюсь в яме и / или делаю вещи намного более сложными, чем необходимо. Любая помощь невероятно ценится, поскольку моего профессора нет в городе, а ТА кажется перегруженным.

1 Ответ

1 голос
/ 06 февраля 2020

Определенно есть способы сделать это без for l oop, но, так как вы хотите явно использовать for l oop для этого упражнения, мы можем использовать функцию even.odd, которая работает для одного числа и создайте новую функцию, которая использует for l oop и вызывает функцию even.odd для каждого элемента индивидуально.

even.odd.vec <- function(x) {
   result <- character(length = length(x))
   for (i in seq_along(x)) {
    result[i] <- even.odd(x[i])
  }
  return(result)
}

Затем можно передать векторы test1, test2 в эту функцию.

even.odd.vec(test1)
#[1] "odd"  "even" "even" "odd" 
even.odd.vec(test2)
#[1] "even" NA     NA   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...