Base R定义了一个identity
函数,一个返回其参数的普通身份函数(引自?identity
)。
它被定义为:
identity <- function (x){x}
为什么这样一个微不足道的功能会有用呢?为什么它会包含在基础R中?
不了解R,但在函数式语言中,经常将函数作为参数传递给其他函数。在这种情况下,常量函数(对任何参数返回相同的值)和标识函数在乘法中扮演类似0和1的角色,可以这么说。
我不时使用命令的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
出现在简单的code base search上的一个用途是为了方便tryCatch
中最基本的错误处理功能。
tryCatch(...,error = identity)
这是相同的(哈!)
tryCatch(...,error = function(e) e)
因此,此处理程序将捕获错误消息,然后只返回它。
无论它的价值如何,它都位于基础软件包源代码中的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().
退出函数式编程,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
不是链接构造函数使用的函数,它仅用于解析链接名称。 (而不是删除这个答案,我会留下它来帮助澄清两者之间的区别。)
这是用法示例:
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代替
我只是这样使用它:
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))
}