Base R定义了一个identity
函数,一个简单的身份函数返回其参数(引自?identity
)。
定义为:
identity <- function (x){x}
为什么这样一个微不足道的功能会有用?为什么它会包含在基数R?
中答案 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年被添加为“便利函数”:我可以想象(但是可以不要给出一个直接的例子!)在函数式编程方法中会有一些上下文(即使用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().
答案 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()
作为最后一行,则永远不需要注释掉。因此,您可以通过注释来暂时排除任何更改数据的行。