Может ли кто-нибудь сказать мне, как объединить функцию-оболочку с условиями 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)
Спасибо!
@RonakShah Привет, это был просто пример - мне нужно решить условие ЕСЛИ для случая, когда объект является вектором, и я хочу, чтобы результатом было только одно число ... но я пока не решил это, поэтому я использовал это
Обычно для обработки разных классов (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)
Привет, спасибо за ответ, я вижу, что вы там делаете, но мне нужна одна функция-оболочка с условиями if:/это требование. И, пожалуйста, как я могу совместить это с условием, когда объект является вектором? Спасибо за Ваш ответ!
Если под вектором вы подразумеваете что-то, что не имеет измерений или одно измерение, тогда проверьте его на length(dim(x)) < 2
. Например, они имеют размеры 0, 1 и 2 соответственно: 1:3, массив(1:3), mtcars.
Вы применяете один и тот же код независимо от того, являются ли данные матрицей или фреймом данных. Зачем тогда вам здесь
if
/else
?