函数定义中为什么要接受符号字符?

4

由于我发现了一个错别字,因此发现这个代码可以工作[注意第2行中重复的-]

foo <- function()
-------------------------
{
  1
}

调用foo()会返回-1-的数量决定了返回值是正数还是负数[奇数次返回负数]。

我没有找到有关这个R函数定义的任何信息,现在我想知道为什么允许这样做以及其目的是什么。

即使是官方的R文档也没有提到这一点。 有任何想法吗?

注意:invisible(1)无效。 当在开放{之前有一个符号字符时,输出不会被抑制。


1
这个有点奇怪,我从来没有见过(也不会尝试)。如果你仔细想一下,{}实际上只是零个或多个R表达式的块,并且保留/返回最后一个表达式。例如,{1;2;3}“返回”3。从那里开始,一个前导-就会“否定”最后一个语句,所以-{1;2;3}返回-3等。在这种情况下,由于返回了一个数字(或类似数字的类),它可以正常工作。如果你改成foo <- function() ---{"a"},它将失败。 - r2evans
由于R允许多个“-”符号,因此“----2”等同于“2”,在代码块之前加入任意数量的减号应更有意义。 - r2evans
1个回答

3

您已经被R语言函数体的奇怪语法规则所困扰。

由于R中函数的语法允许在参数列表后面使用任何表达式,通常R函数会提供一个由{}包围的表达式列表,有时在其他语言中也称为表达式“块”。在R中,该块的“评估值”是该块中最后一个表达式的“评估值”。

  • 如果-1是有效的表达式,则-{1}也是有效的表达式。

-也是R中的一元求反运算符,并且在R中可以重复使用。因此:

1 = 1
-1 != -1
--1 == 1
----1 == 1
-----1 == -1

那么评估就是这样:

foo <- function() ------------------------- {1}
foo <- function() ------------------------- 1
foo <- function() -1

由于R的语法规则,你同样可以这样写:

foo <- function() -1

好的,当然我在我的问题中称它为“sign”字符而不是“hyphen”。所以我知道“sign”字符的功能。我想知道为什么可以在打开的“{”前放置一个“sign”字符。它也可以使用“+”,但这当然不会改变符号。 - Peter VARGA
CinchBlue,这并没有真正解决PeterVARGA的代码中{...}代码块部分为什么有效的问题(这似乎是一个微不足道但至关重要的事情)。请看我的评论。你提到的重复-的观点是正确的,如果在第一个1周围添加大括号,我认为它会解决这个问题。 - r2evans
他编辑了问题,所以我需要编辑我的答案。 - CinchBlue
我没有编辑我的问题,我只是添加了关于“invisible()”事实的注释。请参阅编辑历史记录。 - Peter VARGA
function() -1 this type of function syntax is commonly used in lapply functions. example lapply(df1, function(x) tail(unique(x))) - Daniel O
我接受并点赞了你的回答,因为你最后的编辑回答了我的问题。在我看来,这似乎是 R 解析器的一个“特性”。 - Peter VARGA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接