Arhn - архитектура программирования

Почему = и ‹- не эквивалентны внутри()?

> within( list(a="a",b="b"), c="c" )
Error in eval(expr, envir, enclos) : argument is missing, with no default
> within( list(a="a",b="b"), c<-"c" )
$a
[1] "a"

$b
[1] "b"

$c
[1] "c"

Я точно не знаю, почему эти два не должны быть эквивалентны. Похоже, что версия = интерпретируется как аргумент с именем c из-за .... Есть ли способ отключить это поведение? Я старался,

within( list(a="a",b="b"), `c`="c" )

но это тоже не удается.

r
13.05.2013

  • По той же причине, по которой system.time(x = rnorm(1e300)) не работает. 13.05.2013
  • Если = является верхним вызовом функции в выражении, переданном функции, то = понимается как назначение аргумента. Сравните с within( list(a="a",b="b"), {c="c"}) 13.05.2013
  • Знак = в качестве присваивания выглядит странно внутри функций, R путается, является ли это присваиванием или аргументом. 13.05.2013
  • Кажется, это тоже работает...within( list(a="a",b="b"), "="(c,"c") ), если вы действительно ненавидите задание <-. :) 13.05.2013
  • Фрэнк Мне нравится беззастенчивая эксплуатация концепции R, согласно которой операторы на самом деле являются просто функциями. Но я думаю, что @MatthewPlourde выигрывает за простоту реализации. :-) 13.05.2013
  • @GreenDemon, я бы не сказал, что R запутался, скорее, он довольно ясен и по делу, и хорошо задокументировал поведение 13.05.2013
  • Также см.: stackoverflow.com/questions/1741820/ и stackoverflow.com/questions/14089066/ 13.05.2013
  • @MatthewPlourde и Фрэнк, не могли бы вы ответить на ваши комментарии? 14.05.2013

Ответы:


1

Вы правы в том, что c="c" (или любое предложение этой формы) интерпретируется как предоставленный аргумент. И нет, это невозможно отключить — это, по-видимому, обрабатывается на уровне синтаксического анализатора R.

Эта разница между = и <- задокументирована ?"<-"

Операторы «‹-» и «=» присваиваются среде, в которой они оцениваются. Оператор «‹-» можно использовать где угодно, тогда как оператор «=» разрешен только на верхнем уровне (например, в полном выражении, набранном в командной строке) или в качестве одного из подвыражений в списке выражений, заключенном в фигурные скобки.

Ярким примером «списка выражений в фигурных скобках» является тело функции, которое вы можете проверить, набрав, например, is(body(plot.default)), length(body(plot.default)).

13.05.2013
  • Спасибо за объяснение. Каждый раз, когда я сталкиваюсь с чем-то подобным, я думаю, что узнаю немного больше о том, как работает синтаксический анализатор R. Теперь, если бы у меня было свободное лето или два или три, чтобы пройтись по исходникам C и выяснить, как это на самом деле работает :-) 13.05.2013
  • @AriB.Friedman -- Эй, не искушай меня пойти посмотреть самому! Я был просто счастлив, наконец, понять, к чему на самом деле ведет эта ссылка на подвыражения в фигурных скобках, и буду считать достижением то, что остановился на этом;) 14.05.2013
  • Объединив предложение @MatthewPlourde с вашим, is(quote({5^2}) возвращает [1] "{" "language" точно так же, как is(body(plot.default)). 14.05.2013

  • 2

    Джош ответил на вопрос «почему», но, по предложению ОП, вот еще одно «как»:

    within( list(a="a",b="b"), "="(c,"c") )
    # $a
    # [1] "a"
    #
    # $b
    # [1] "b"
    #
    # $c
    # [1] "c"
    
    14.05.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..