基本的 R 语言定义了一个 identity
函数,它是一个平凡的恒等函数,返回其自变量(引用自 ?identity
)。
它的定义如下:
identity <- function (x){x}
这个如此琐碎的函数有什么用处呢?为什么它会被包含在基础R中?
基本的 R 语言定义了一个 identity
函数,它是一个平凡的恒等函数,返回其自变量(引用自 ?identity
)。
它的定义如下:
identity <- function (x){x}
这个如此琐碎的函数有什么用处呢?为什么它会被包含在基础R中?
虽然不了解R语言,但在函数式编程中,常常会将一个函数作为参数传递给另一个函数。在这种情况下,常数函数(对于任何参数返回相同的值)和恒等函数的作用类似于乘法中的0和1,可以这么说。
apply
,ddply
,aggregate
,outer
和其他大量函数)。但是我从未需要过自己的identify函数。所以我的问题仍然是:在函数式编程中,为什么需要一个identify函数?它的实际用途是什么?PS.您的答案不必特别针对R,因为这似乎是一个更通用的概念。 - Andrie我时常使用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
一个在简单的代码库搜索中出现的用途,是作为tryCatch
函数中最基本错误处理功能的便利。
tryCatch(...,error = identity)
这与原来的完全相同(哈!)。
tryCatch(...,error = function(e) e)
try
和tryCatch
的工作原理。感谢您提供的示例和参考资料。 - Andrier45063 | 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().
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
并不是链接构造函数使用的函数,它只用于解析链接名称。(我不会删除这个答案,我会留下它来帮助澄清两者之间的区别。)make.link
中的代码;它只是匹配名称“identity”。 - joranHere is usage example:
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}
e->e
lambda代替。identity()
在不同类型的管道末尾非常有用。可以在这里找到带有示例的博客文章:https://rstats-tips.net/2021/06/06/simple-tricks-for-debugging-pipes-within-magrittr-base-r-or-ggplot2/
如果管道链的书写方式是每个“管道”符号都在一行的末尾,那么您可以通过注释它来排除任何行的执行。除了最后一行。如果将identity()
添加为最后一行,则永远不需要注释掉它。因此,您可以通过注释掉任何更改数据的行来暂时排除它们。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))
}
curve(identity(x))
的上下文中看过它的使用(而不是稍微比较晦涩的curve(x*1)
或curve(x+0)
... - Ben Bolkercurve(x)
呢? - AndrieError in eval(expr, envir, enclos) : could not find function "x"
),因为curve
使用有趣的评估规则... - Ben Bolker