Объект формулы не является функцией, и формула будет рассматриваться как функция, только если вызванная функция, которой передается формула, была написана для интерпретации аргументов формулы как функции. Многие из функций tidyverse написаны таким образом, но в общем случае формула по умолчанию не является функцией.
fn $
В пакете gusbfn есть fn$
, что позволит использовать практически любую функциюкоторый принимает аргумент функции для принятия формул. Предисловие вызова функции с fn$
, а затем аргументы формулы интерпретируются как функции (при условии соблюдения определенных правил).
В примере, приведенном в вопросе, мы можем сделать это, не требуя написания специальной версии sapply
для интерпретации формул как функций:
library(gsubfn)
fn$sapply(names(mtcars), item ~ mean(mtcars[[item]]))
, что дает:
mpg cyl disp hp drat wt qsec
20.090625 6.187500 230.721875 146.687500 3.596563 3.217250 17.848750
vs am gear carb
0.437500 0.406250 3.687500 2.812500
См. ?fn
для получения дополнительной информации и примеров.
match.funfn
В пакете gsubfn также есть match.funfn
, что похоже на match.fun
в базе R, кроме неготакже будет интерпретировать формулы как функции. Это позволяет писать свои собственные функции, которые принимают аргументы формулы, интерпретируя их как функции.
В соответствии с примером в вопросе:
library(gsubfn)
sapplyfn <- function(X, FUN, ...) {
FUN <- match.funfn(FUN)
sapply(X, FUN, ...)
}
sapplyfn(names(mtcars), item ~ mean(mtcars[[item]]))
, дающим:
mpg cyl disp hp drat wt qsec
20.090625 6.187500 230.721875 146.687500 3.596563 3.217250 17.848750
vs am gear carb
0.437500 0.406250 3.687500 2.812500
as.function.formula
Пакет gsubfn такжеимеет as.function.formula
, который преобразует формулу в функцию. Используется fn$
и match.funfn
. Например,
library(gsubfn)
as.function(item ~ mean(mtcars[[item]]))
, дающий:
function (item)
mean(mtcars[[item]])