Подавить вывод функции в R, если отсутствует аргумент

Я новичок в написании функций и хотел бы подавить вывод, если данный аргумент в функции не сообщается, без необходимости писать несколько return() для каждого потенциального оператора. Например:

fun <- function(x1,x2, y){
    if(missing(y)){result<- x1+x2}
    if(!missing(y)){ols<-lm(y ~ x1 + x2)}  
return(list(result = result, 
            ols = ols))

}   

x1 <- rnorm(100)
x2 <- rnorm(100)

fun(x1,x2)

Когда вы запускаете это, вы получаете сообщение об ошибке, поскольку OLS не сообщается (если вы включите y, вы получите ту же проблему для объекта «результат»). Можно ли подавить один из возвращаемых элементов, не включая специальную функцию return() в каждый оператор if? Спасибо за любые мысли


person coding_heart    schedule 31.10.2013    source источник


Ответы (2)


Вы можете использовать compact из plyr в сочетании с инициализацией объектов result и ols как NULL в начале.

library(plyr)

fun <- function(x1, x2, y){
  result = ols = NULL
  if(missing(y))
    result <- x1+x2
  if(!missing(y))
    ols <- lm(y ~ x1 + x2)
  return(compact(list(result = result, 
          ols = ols)))

}   

x1 <- rnorm(100)
x2 <- rnorm(100)

fun(x1,x2)

plyr::compact удаляет элементы NULL из списка

person sckott    schedule 31.10.2013
comment
Если вы не хотите использовать plyr::compact, вы можете использовать оператор sapply из базы R, сначала создав объект списка возврата, затем используя my.list <- my.list[!sapply(my.list, is.null)], а затем вернув my.list - person scottyaz; 31.10.2013
comment
@scottyaz Верно, но я думаю, что при использовании компактного кода меньше кода, и я полагаю, что большинство людей все равно установили plyr в наши дни? - person sckott; 31.10.2013

Используйте функцию try для обработки ошибок:

try(fun(x1,x2),silent=TRUE)
person Jonas Tundo    schedule 31.10.2013