R中身份函数的实际用途是什么?

问题描述 投票:32回答:7

Base R定义了一个identity函数,一个返回其参数的普通身份函数(引自?identity)。

它被定义为:

identity <- function (x){x}

为什么这样一个微不足道的功能会有用呢?为什么它会包含在基础R中?

r functional-programming identity
7个回答
15
投票

不了解R,但在函数式语言中,经常将函数作为参数传递给其他函数。在这种情况下,常量函数(对任何参数返回相同的值)和标识函数在乘法中扮演类似0和1的角色,可以这么说。


10
投票

我不时使用命令的apply函数。

例如,您可以将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

7
投票

出现在简单的code base search上的一个用途是为了方便tryCatch中最基本的错误处理功能。

tryCatch(...,error = identity)

这是相同的(哈!)

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

因此,此处理程序将捕获错误消息,然后只返回它。


6
投票

无论它的价值如何,它都位于基础软件包源代码中的funprog.R(函数式编程)中,并在2008年被添加为“便利函数”:我可以想象(但不能给出一个直接的例子! )在函数式编程方法中会有一些上下文(即使用FilterReduceMap等),这样可以方便地拥有一个身份函数......

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
投票

退出函数式编程,identity也用于R中的另一个上下文,即统计。这里,它用于指link function中的身份generalized linear models。有关此内容的更多详细信息,请参阅?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
投票

这是用法示例:

    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分组为int / count映射。 Collectors.groupingBy接受一个函数。在我们的例子中,我们需要一个返回参数的函数。请注意,我们可以使用e->e lambda代替


0
投票

我只是这样使用它:

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))
}
© www.soinside.com 2019 - 2024. All rights reserved.