#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 .