Функция-оболочка с условиями if

#r

#r

Вопрос:

Не мог бы кто-нибудь, пожалуйста, сказать мне, как объединить функцию-оболочку с условиями if ..else? Например, эта оболочка:

 wrapper<-function(x){
  varcoef<-function(x){
    sd(x)/mean(x)
  }
  apply(x,MARGIN = 2, FUN=varcoef)
}

wrapper(mtcars) 
 

С:

 if(is.matrix(x)==TRUE){
  apply(x,2,function(x) sd(x)/mean(x))
} else if (is.data.frame(x)==TRUE){
  apply(x,2,function(x) sd(x)/mean(x))
} else print(NULL)
 

Спасибо!

Комментарии:

1. Вы применяете один и тот же код независимо от того, являются ли данные матрицей или фреймом данных. Тогда зачем вам нужен if / else here ?

2. @RonakShah Привет, это был просто пример — мне нужно решить условие IF для случая, когда объект является векторным, и я хочу, чтобы результатом было только одно число .. но я пока не решил его, поэтому я использовал это

Ответ №1:

Обычно для обработки разных классов (matrix, data.frame) создается общий и отправляется методу для каждого класса, а не для использования if . Это обеспечивает модульный подход, при котором новые классы могут быть добавлены без изменения существующего кода — просто добавьте новый метод.

 wrapper <- function(x, ...) {
  varcoef <- function(x) sd(x) / mean(x)
  UseMethod("wrapper")
}

wrapper.data.frame <- function(x, ...) {
  is.num <- sapply(x, is.numeric)
  apply(x[is.num], 2, varcoef)
}

wrapper.matrix <- function(x, ...) {
  stopifnot(is.numeric(x))
  apply(x, 2, varcoef)
}

# tests

wrapper(CO2)

m <- as.matrix(BOD)
wrapper(m)
 

Если вы хотите использовать if в любом случае, то:

 wrapper <- function(x, ...) {
  varcoef <- function(x) sd(x) / mean(x)
  if (inherits(x, "data.frame")) {
    is.num <- sapply(x, is.numeric)
    apply(x[is.num], 2, varcoef)
  } else {
    stopifnot(is.numeric(x))
    apply(x, 2, varcoef)
  }
}
   
# tests

wrapper(CO2)

m <- as.matrix(BOD)
wrapper(m)
 

Комментарии:

1. Привет, спасибо за ответ, я вижу, что вы там делаете, но мне нужна одна функция-оболочка с условиями if:/ это требование. И, пожалуйста, как я могу объединить это также с условием, когда объект является вектором? Спасибо за ваш ответ!

2. Если под вектором вы подразумеваете что-то, что не имеет измерений или 1 измерения, тогда проверьте это length(dim(x)) < 2 . Например, они имеют размеры 0, 1 и 2 соответственно: 1: 3, массив (1: 3), mtcars .