Консоль R: однострочные инструкции против многострочных

Я заметил, что в некоторых случаях (я все еще новичок в 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')?

1 ответ

Решение

Возврат каретки (или перевод строки) разделяет команды. (Ранее я говорил, что это разделяет "выражения", но в 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 } }
Другие вопросы по тегам