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

时间:2011-08-18 14:14:54

标签: r functional-programming identity

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

定义为:

identity <- function (x){x}

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

8 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:9)

我不时使用命令的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

答案 2 :(得分: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().

答案 3 :(得分:6)

简单code base search上显示的一个用途是为tryCatch中最基本类型的错误处理函数提供便利。

tryCatch(...,error = identity)

完全相同(ha!)
tryCatch(...,error = function(e) e)

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

答案 4 :(得分: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不是链接构造函数使用的函数,它仅用于解析链接名称。 (而不是删除这个答案,我会留下来帮助澄清两者之间的区别。)

答案 5 :(得分: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

答案 6 :(得分: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))
}

答案 7 :(得分:0)

因为这个问题已经被浏览了 8000 次,所以即使在它写完 9 年后也值得更新。

在一篇名为“调试管道的简单技巧(在 magrittr、base R 或 ggplot2 中)”的博客文章中,作者指出 identity() 在不同类型管道的末端非常有用。可以在此处找到包含示例的博文:https://rstats-tips.net/2021/06/06/simple-tricks-for-debugging-pipes-within-magrittr-base-r-or-ggplot2/

如果管道链以某种方式编写,即每个“管道”符号都位于一行的末尾,您可以通过将其注释掉来将任何行排除在执行之外。除了最后一行。如果您添加 identity() 作为最后一行,则永远不需要注释掉。因此,您可以通过注释来暂时排除任何更改数据的行。