我遇到了“The Programming of R Programming”一书的编辑评论,并发现了这个
R编程的艺术带您了解R的软件开发,从基本类型和数据结构到高级主题,如闭包,递归和匿名函数
我立即对匿名函数的想法着了迷,这是我在Python中以lambda函数的形式遇到的但是无法用R语言建立连接。
我在R手册中搜索并找到了这个
通常将函数分配给符号,但它们不需要。调用函数返回的值是一个函数。如果没有给出名称,则将其称为匿名函数。匿名函数最常用作其他函数的参数,例如apply family或outer。
对于像我这样不太长时间的程序员而言,这些事情以一种非常有趣的方式“古怪”。 哪里可以找到更多这些R(无需购买书籍)?
感谢您分享您的建议
答案 0 :(得分:17)
函数在R中没有名称。是否碰巧将函数放入变量中不是函数本身的属性,因此不存在两种函数:匿名并命名。我们能做的最好的事情是同意调用一个从未被赋值给匿名变量的函数。
函数f
可被视为由其正式参数组成的三元组,其正文和环境可通过formals(f)
,body(f)
和environment(f)
单独访问。这个名字不是那个三重奏的任何一部分。请参阅语言定义function objects的manual部分。
请注意,如果我们想要一个函数来调用自身,那么我们可以使用Recall
来避免知道函数是否被赋值给变量。另一种方法是函数体必须知道函数已分配给特定变量以及该变量的名称是什么。也就是说,如果将函数分配给变量f
,那么主体可以引用f
来调用自身。 Recall
仅限于自我调用功能。如果我们有两个相互调用的函数,则Recall
的对应函数不存在 - 每个函数必须命名另一个函数,这意味着每个函数必须已分配给变量,并且每个函数体必须知道变量已指定其他功能的名称。
答案 1 :(得分:5)
关于R中的匿名函数没有太多可说的。与Python不同,lambda函数需要特殊的语法,在R中,匿名函数只是一个没有名称的函数。
例如:
function(x,y) { x+y }
而正常的,命名的函数将是
add <- function(x,y) { x+y }
函数是第一类对象,因此您可以将它们(无论它们是否是匿名的)作为其他函数的参数传递。将其他函数作为参数的函数示例包括apply
,lapply
和sapply
。
答案 2 :(得分:4)
答案 3 :(得分:2)
到目前为止关于风格的好答案。以下是关于R中匿名函数的典型用法的答案:
# Make some data up
my.list <- list()
for( i in seq(100) ) {
my.list[[i]] <- lm( runif(10) ~ runif(10) )
}
# Do something with the data
sapply( my.list, function(x) x$qr$rank )
我们可以命名该函数,但是对于简单的数据提取等等,它是非常方便的。