R 中恒等函数的实际用途是什么?
Base R 定义了一个identity
函数,一个返回其参数的简单恒等函数(引用自?identity
)。
它的定义是:
identity <- function (x){x}
为什么这样一个微不足道的函数会有用?为什么它会被包含在基础 R 中?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
不管它的价值如何,它位于基础包源代码中的 funprog.R(函数式编程的东西)中,并且它在 2008 年被添加为“便利函数”:我可以想象(但不能给出一个直接的例子!)函数式编程方法中会有一些上下文(即使用
Filter
、Reduce
、Map
等等)它会在哪里方便有身份识别功能...For whatever it's worth, it is located in
funprog.R
(the functional programming stuff) in the source of the base package, and it was added as a "convenience function" in 2008: I can imagine (but can't give an immediate example!) that there would be some contexts in the functional programming approach (i.e. usingFilter
,Reduce
,Map
etc.) where it would be convenient to have an identity function ...除了函数式编程之外,
identity
还用于 R 中的另一个上下文,即统计。这里用来指代链接函数 ://en.wikipedia.org/wiki/Generalized_linear_model" rel="nofollow">广义线性模型。有关此内容的更多详细信息,请参阅?family
或?glm
。这是一个示例:但是,在这种情况下,将其解析为字符串而不是函数将实现相同的效果:
glm(y ~x, family=quasi(link="identity"))
编辑:如下面的注释所示,函数
base::identity
不是链接构造函数使用的函数,它仅用于解析链接名称。 (我不会删除这个答案,而是将其保留以帮助澄清两者之间的区别。)Stepping away from functional programming,
identity
is also used in another context in R, namely statistics. Here, it is used to refer to the identity link function in generalized linear models. For more details about this, see?family
or?glm
. Here is an example:However, in this case parsing it as a string instead of a function will achieve the same:
glm(y ~x, family=quasi(link="identity"))
EDIT: As noted in the comments below, the function
base::identity
is not what is used by the link constructor, and it is just used for parsing the link name. (Rather than deleting this answer, I'll leave it to help clarify the difference between the two.)我只是这样使用它:
I just used it like this:
由于这个问题已经被查看了 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()
作为最后一行,则永远不需要将其注释掉。因此,您可以通过注释掉任何更改数据的行来暂时排除它。As this question has already been viewed 8k times it maybe worth updating even 9 years after it has been written.
In a blog post called "Simple tricks for Debugging Pipes (within magrittr, base R or ggplot2)" the author points out how
identity()
can be very usefull at the end of different kinds of pipes. The blogpost with examples can be found here: https://rstats-tips.net/2021/06/06/simple-tricks-for-debugging-pipes-within-magrittr-base-r-or-ggplot2/If pipe chains are written in a way, that each "pipe" symbol is at the end of a line, you can exclude any line from execution by commenting it out. Except for the last line. If you add
identity()
as the last line, there will never be a need to comment that out. So you can temporarily exclude any line that changes the data by commenting it out.这是用法示例:
这里我们将整数分组到 int/count 映射中。 Collectors.groupingBy 接受一个函数。在我们的例子中,我们需要一个返回参数的函数。请注意,我们可以使用
e->e
lambda 代替Here is usage example:
here we are grouping ints into a int/count map. Collectors.groupingBy accepts a Function. In our case we need a function which returns the argument. Note that we could use
e->e
lambda instead我刚刚使用它将矩阵拆分为其列列表。示例:
这里,函数
apply
将identity
函数应用于矩阵m
的每一列,即它只返回列。simplify = FALSE
需要将其保留为列表,而不是简化回数组。I have just used it to split a matrix into the list of its columns. An example:
Here, the function
apply
applies theidentity
function to each column of the matrixm
, i.e. it just returns the columns.simplify = FALSE
needed to keep it as a list rather than simplify back to an array.不了解 R,但在函数式语言中,人们经常将函数作为参数传递给其他函数。在这种情况下,常量函数(对任何参数都返回相同的值)和恒等函数在乘法中扮演着与 0 和 1 类似的角色。
Don't know about R, but in a functional language one often passes functions as arguments to other functions. In such cases, the constant function (which returns the same value for any argument) and the identity function play a similar role as 0 and 1 in multiplication, so to speak.
我时常将它与命令的 apply 功能一起使用。
例如,您可以将
t()
编写为:I use it from time to time with the apply function of commands.
For instance, you could write
t()
as:出现在简单的 代码库搜索是为了方便
tryCatch
中最基本类型的错误处理函数。这与(哈!)相同,
所以这个处理程序会捕获错误消息,然后简单地返回它。
One use that appears on a simple code base search is as a convenience for the most basic type of error handling function in
tryCatch
.which is identical (ha!) to
So this handler would catch an error message and then simply return it.