1) Вопрос не ясен относительно того, что ожидается в качестве вывода для length
, но если вопрос заключается в том, как удалить NA, независимо от того, принимает ли функция аргумент na.rm
или нет, тогда сначала просто удалите NA.
show_stats2 <- function(x) {
funs <- list(mean = mean, sd = sd, length = length)
lapply(funs, function(f) f(na.omit(x)))
}
2) Другая возможность, которая позволяет функциям иметь произвольно изменяющиеся аргументы, заключается в следующем. Каждая функция определяется как простая формула с подходящими аргументами. Здесь используется fn$
из gsubfn для преобразования формулы в функцию.
library(gsubfn)
show_stats3 <- function(x) {
funs <- list(mean = ~ mean(x, na.rm = TRUE),
sd = ~ sd(x, na.rm = TRUE),
length = ~ length(x))
fn$lapply(funs, function(f) fn$identity(f)(x))
}
3) Вот вариант (2), который требует, чтобы вы написали слово function
но так же гибок:
show_stats4 <- function(x) {
funs <- list(mean = function(x) mean(x, na.rm = TRUE),
sd = function(x) sd(x, na.rm = TRUE),
length = length)
lapply(funs, function(f) f(x))
}
4) Еще одним вариантом является использование Curry
из функционального пакета:
library(functional)
show_stats5 <- function(x) {
funs <- list(mean = Curry(mean, na.rm = TRUE),
sd = Curry(sd, na.rm = TRUE),
length = length)
lapply(funs, function(f) f(x))
}