2

我注意到,在某些情况下(我仍然是 R 的初学者!),多行指令不能“按原样”合并为简单的行指令。举个例子,这是我最近在网上上的一节课:

> make.power <- function(n) {
+     pow <- function(x) {
+         x^n
+         }
+         pow
+     }

是'make.power'函数的定义。然后我可以定义“立方体”或平方函数

> cube <- make.power(3)
> square <- make.power(2)

然后,如果我尝试使用完全相同的语法在一行上定义 make.power :

> make.power <- function(n) { pow <- function(x) { x^n } pow }

这将在“make.power ...”中引发“意外符号”。也就是说,以下单行代码将起作用:

> make.power <- function(n) { pow <- function(x) { x^n }}

而且,当切换到多线时,仍然可以工作!

> make.power <- function(n) {
+     pow <- function(x) {
+         x^n
+         }
+     }

我必须承认我很困惑。我的问题如下:

  1. 为什么我不能将多行代码合并到单行指令中?
  2. 在函数的第一个多行定义中,为什么要在函数定义后立即调用'pow'函数,这显然是没有意义的,因为没有调用的相同代码是可以的!

编辑:在#Dwin 回答之后,下面的表达式是真的:

> make.power <- function(n) { pow <- function(x) { x^n }; pow }

完美运行。这个也是:

> make.power <- function(n){; pow <- function(x) {; x^n }; pow }

所以看起来“;” 在某些情况下可能是强制性的(这里,在“}”和第二个“pow”之间,而不是在其他情况下(在“{”和第一个“pow”之间)?

4

1 回答 1

8

回车(或换行)分隔命令。(我之前说过它分隔“表达式”,但在 R 中,这并不是真正正确的术语。R 意义上的“表达式”实际上是用逗号分隔的。)如果你在一行中插入一个分号,你会得到相同的结果影响。尽管存在不必要的事实,但代码仍然可以作为该事实的示例:

make.power <- function(n) { pow <- function(x) { x^n }; pow }

help()我很失望,在我查看的任何文件中都找不到这样的说明。我认为通过打字?Syntax我应该找到相关的东西。我能想到的最好的就是help(parse)页面,即使在那里,只有通过查看示例才能推断出这一点。我猜您应该已经阅读了“R 简介”,我有理由确定必须对其进行描述。是的,它在第 1.8 节中。

回应您的Q2:在将内部函数(...)的“<-”分配给“pow”的过程中,返回给外部函数调用的值只是未命名的函数,而不是任何具有名称的函数“战俘”。这是我对您的第一条评论的评论的重点。这可能比你从“Intro to R”中得到的更微妙的一点。当仅分配对象的一部分是最后一个命令时,有时需要该return函数,但在这种情况下,最紧凑的代码应该是:

make.power <- function(n) { function(x) { x^n } }
于 2013-01-13T21:30:32.220 回答