Функция не возвращает результат в R - PullRequest
0 голосов
/ 29 августа 2018

У меня есть функция, которая берет вектор и возвращает вывод.

my.function <- function(x){

   if (1 %in% x) {

     first.data <- data.frame(a = c(1, 2), b = c("a", "b"))
     return(first.data)    
   }

   if (2 %in% x){

   second.data <- data.frame(a = c("I", "II"), b = c("a", "b"))
   return(second.data) 
}}

my.function(x = c(1, 2))
  a b
  1 a
  2 b

Почему моя функция не возвращает first.data и second.data?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Всякий раз, когда выполняется оператор return, он не будет выполнять следующие шаги в функции. Если вы хотите вернуть оба выхода, используйте return для отправки окончательного результата.

my.function <- function(x){
    first.data<-data.frame()
    second.data<-data.frame()
    if (1 %in% x) {
    first.data <- data.frame(a = c(1, 2), b = c("a", "b"))
    }

    if (2 %in% x){
        second.data <- data.frame(a = c("I", "II"), b = c("a", "b"))
    }
    return(list(first.data,second.data))
}
0 голосов
/ 29 августа 2018

Это должно работать:

my.function <- function(x){
first.data <- data.frame() 
second.data <- data.frame()

if (1 %in% x) {
 first.data <- data.frame(a = c(1, 2), b = c("a", "b"))   
}

if (2 %in% x){
   second.data <- data.frame(a = c("I", "II"), b = c("a", "b"))
}
list(first.data, second.data) # last element not declared is returned.
}

Нет необходимости в return.

Имейте в виду, что если if-statement оценивается как FALSE, он выдаст ошибку, потому что функция не найдет first.data или second.data.

0 голосов
/ 29 августа 2018

Вы можете просто вызвать функцию, используя lapply следующим образом:

lapply(1:2,my.function)

Выход:

[[1]]
  a b
1 1 a
2 2 b

[[2]]
   a b
1  I a
2 II b

Если вы хотите следовать вашему подходу, то:

 my.function <- function(x){
  for(i in 1:length(x)){ # This will call for each element in x
  if (1 %in% x) {
    first.data <- data.frame(a = c(1, 2), b = c("a", "b"))
    data = (first.data)    # Store intermediate result to data
  }

  if (2 %in% x){

    second.data <- data.frame(a = c("I", "II"), b = c("a", "b"))
    data=rbind(data,second.data) # Row wise bind the result
  }
    return(data) # Return the data
 }
}
my.function(x = c(1, 2))

Выход:

    a b
 1  1 a
 2  2 b
 3  I a
 4 II b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...