Каково практическое использование функции тождества в R?
Base R определяет функцию identity
, тривиальную функцию идентичности, возвращающую свой аргумент (цитата из ?identity
).
Он определяется как:
identity <- function (x){x}
Почему такая тривиальная функция когда-либо была бы полезной? Почему он должен быть включен в базу R?
Ответы
Ответ 1
Не знаю о R, но на функциональном языке часто передаются функции как аргументы другим функциям. В таких случаях постоянная функция (которая возвращает одно и то же значение для любого аргумента) и функция тождества, так сказать, играет аналогичную роль как 0 и 1.
Ответ 2
Я использую его время от времени с применением функции команд.
Например, вы можете написать t()
как:
dat <- data.frame(x=runif(10),y=runif(10))
apply(dat,1,identity)
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
x 0.1048485 0.7213284 0.9033974 0.4699182 0.4416660 0.1052732 0.06000952
y 0.7225307 0.2683224 0.7292261 0.5131646 0.4514837 0.3788556 0.46668331
[,8] [,9] [,10]
x 0.2457748 0.3833299 0.86113771
y 0.9643703 0.3890342 0.01700427
Ответ 3
Одно использование, которое появляется в простом базовом поиске кода, является удобством для наиболее простого типа функции обработки ошибок в tryCatch
.
tryCatch(...,error = identity)
который идентичен (ha!) до
tryCatch(...,error = function(e) e)
Итак, этот обработчик поймает сообщение об ошибке, а затем просто вернет его.
Ответ 4
Что бы это ни стоило, он находится в funprog.R
(материал функционального программирования) в источнике базового пакета и был добавлен в качестве "удобной функции" в 2008 году: я могу представить (но не могу давайте пример!), что в подходе к функциональному программированию могут быть некоторые контексты (т.е. с использованием Filter
, Reduce
, Map
и т.д.), где было бы удобно иметь функцию тождества...
r45063 | hornik | 2008-04-03 12:40:59 -0400 (Thu, 03 Apr 2008) | 2 lines
Add higher-order functions Find() and Position(), and convenience
function identity().
Ответ 5
Отступая от функционального программирования, identity
также используется в другом контексте в R, а именно в статистике. Здесь он используется для обозначения функции в обобщенных линейных моделях. Подробнее об этом см. ?family
или ?glm
. Вот пример:
> x <- rnorm(100)
> y <- rpois(100, exp(1+x))
> glm(y ~x, family=quasi(link=identity))
Call: glm(formula = y ~ x, family = quasi(link = identity))
Coefficients:
(Intercept) x
4.835 5.842
Degrees of Freedom: 99 Total (i.e. Null); 98 Residual
Null Deviance: 6713
Residual Deviance: 2993 AIC: NA
Однако в этом случае синтаксический анализ его как строки вместо функции приведет к такому же: glm(y ~x, family=quasi(link="identity"))
EDIT. Как отмечено в комментариях ниже, функция base::identity
не является тем, что используется конструктором link, и используется только для разбора имени ссылки. (Вместо того, чтобы удалять этот ответ, я оставлю его, чтобы помочь прояснить разницу между ними.)