Почему это работает как цикл for, а не внутри функции? - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь написать функцию, которая определяет, является ли число в числовом векторе нечетным или четным. Числовой вектор имеет длину 1000.

Я знаю, что цикл for работает нормально, и я просто хотел обобщить его в виде функции, которая принимает вектор любой длины

out<-vector()
f3<- function(arg){
  for(i in 1:length(arg)){
    if((arg[i]%%2==0)==TRUE){
      out[i]<-1
    }else{out[i]<-0
    }
  }
}

Однако при запуске внутри функции она просто возвращает NULL. Почему, или что мне нужно сделать, чтобы обобщить работу функции с любым числовым вектором?

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Как уже упоминалось PKumar в комментариях: Ваша функция ничего не возвращает, то есть вектор out существует только в среде вашей функции.

Чтобы изменить это, вы можете добавить return(out) до конца вашей функции. И вы также должны начать свою функцию с создания out перед циклом. Таким образом, ваша функция будет выглядеть, как показано ниже.

Обратите внимание, что я предполагаю, что вы хотите передать в функцию вектор определенной длины и в результате получить вектор такой же длины, который содержит 1для четных чисел и 0 для нечетных чисел. f3(c(1,1,2)) вернет 0 0 1.

f3 <- function(arg){

  out <- vector(length = length(arg), mode = "integer")

  for(i in 1:length(arg)){

    if((arg[i]%%2==0)==TRUE){ # note that arg[i]%%2==0 will suffice
      out[i]<-1
    } else {out[i]<-0
    }
  }

  return(out) # calling out without return is enough and more inline with the tidyverse style guide
}

Однако, как также указывает Себастьян в комментариях, some_vector %% 2 дает почти тот же результат. Разница в том, что нечетные числа дают 1 и четные числа 0. Вы также можете поместить это в функцию и вычесть 1 из arg для обратного 0 и 1:

f3 <- function(arg){
  (arg-1) %% 2
}
0 голосов
/ 12 октября 2019

Несколько замечаний по поводу вашего кода:

  1. Функция должна возвращать что-то
  2. Логическое условие if ((arg [i] %% 2 == 0) ==ИСТИНА) является излишним. if (arg [i] %% 2 == 0) достаточно, но неверно, потому что arg [i] не существует.
  3. длина (arg) - это длина (1000), которая, если выполняется,возвращает 1 Вам следует изменить arg [i] с помощью i и присвоить i все значения от 1: 1000 следующим образом:

R

out <-vector()
f3 <- function(arg){
  for(i in 1:arg){
    if(arg[i] %% 2 == 0){
      out[i] <- 1
      }
    else{
      out[i] <- 0
    }
  }
  return(out)
}
f3(1000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...