Каково практическое использование функции тождества в R? - PullRequest
32 голосов
/ 18 августа 2011

База R определяет функцию identity, - тривиальную единичную функцию, возвращающую свой аргумент (в кавычках из ?identity).

Он определяется как:

identity <- function (x){x}

Почему такая тривиальная функция будет полезна? Почему это должно быть включено в базу R?

Ответы [ 7 ]

14 голосов
/ 18 августа 2011

Не знаю о R, но на функциональном языке часто передают функции в качестве аргументов другим функциям. В таких случаях функция константы (которая возвращает одинаковое значение для любого аргумента) и функция тождества играют, так сказать, 0 и 1 при умножении.

9 голосов
/ 18 августа 2011

Время от времени я использую его с функцией применения команд.

Например, вы можете написать 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
6 голосов
/ 18 августа 2011

Одно использование, которое появляется при простом поиске по базе кода , - это удобство для самого основного типа функции обработки ошибок в tryCatch.

tryCatch(...,error = identity)

, которая идентична (ха!) до

tryCatch(...,error = function(e) e)

Так что этот обработчик поймает сообщение об ошибке, а затем просто вернет его.

6 голосов
/ 18 августа 2011

Во что бы то ни стало, он находится в 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().
2 голосов
/ 18 августа 2011

Отходя от функционального программирования, 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"))

РЕДАКТИРОВАТЬ : Как отмечено в комментариях ниже, функция base::identity - это не то, что используется конструктором ссылок, а просто для анализа имени ссылки. (Вместо того, чтобы удалять этот ответ, я оставлю его, чтобы прояснить разницу между ними.)

0 голосов
/ 08 марта 2019

Я просто использовал это так:

fit_model <- function(lots, of, parameters, error_silently = TRUE) {

  purrr::compose(ifelse(test = error_silently, yes = tryNA, no = identity),
                 fit_model_)(lots, of, parameters)
}

tryNA <- function(expr) {
  suppressWarnings(tryCatch(expr = expr,
                            error = function(e) NA,
                            finally = NA))
}
0 голосов
/ 23 октября 2018

Вот пример использования:

    Map<Integer, Long> m = Stream.of(1, 1, 2, 2, 3, 3)
            .collect(Collectors.groupingBy(Function.identity(),
                    Collectors.counting()));
    System.out.println(m);
    output:
    {1=2, 2=2, 3=2}

здесь мы группируем целые в карту int / countCollectors.groupingBy принимает функцию.В нашем случае нам нужна функция, которая возвращает аргумент.Обратите внимание, что мы могли бы использовать e->e лямбда вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...