Объявление переменной константы в R

OPA (Open Portable Atomics) может подойти для ваших нужд. https://trac.mcs.anl.gov/projects/openpa/

. Он обеспечивает согласованный C API для общих элементарных операций на нескольких платформах под лицензией в стиле MIT. Библиотека небольшая и, безусловно, отвечает вашим требованиям к размеру. Текущий список платформ:

  • Встроенная сборка GCC для процессоров x86, x86_64, ia64, PPC 440 и MIPS 5K. Несколько компиляторов с GCC-совместимым интерфейсом ish также поддерживаются в одной архитектуре, такой как icc, PGI и IBM xlc.
  • Атомные свойства GCC, поэтому поддерживается большинство установок GCC-4.1 +.
  • Библиотека атомных операций SUN Solaris.
  • Встроенные функции Windows NT (хотя в настоящее время вам нужно проделать небольшую дополнительную работу для сборки в Windows).
  • Две псевдоплатформы, эмуляция на основе мьютекса pthread для переносимости на другие неподдерживаемые платформы (при этом жертвуя некоторой производительностью), и «небезопасная» реализация для использования в коде, который условно компилируется в однопоточный код.

Я никогда не использовал его в программе на C ++, хотя он должен работать практически без изменений. Я был бы рад настроить его, если у вас возникнут проблемы (просто напишите opa-discuss@lists.mcs.anl.gov).

37
задан James Thompson 2 June 2009 в 15:30
поделиться

6 ответов

См. lockBinding :

a <- 1
lockBinding("a", globalenv())
a <- 2
Error: cannot change value of locked binding for 'a'
44
ответ дан 27 November 2019 в 04:48
поделиться

(Отредактировано для новой идеи :) Функции bindenv предоставляют

экспериментальный интерфейс для корректировки сред и привязок внутри сред. Они позволяют блокировать среды, а также отдельные привязки и связывать переменную с функцией.

Это похоже на то, что может дать ложное ощущение безопасности (например, указатель const на переменная, отличная от const ), но это может помочь.

(Отредактировано для фокусировки :) const - это гарантия времени компиляции , а не блокировка - вниз по битам в памяти. Поскольку в R нет фазы компиляции, на которой он просматривает весь код сразу (он создан для интерактивного использования), нет способа проверить, не нарушат ли будущие инструкции никаких гарантий. Если есть правильный способ сделать это, люди из списка R-help будут знать. Предлагаемый мной обходной путь: подделайте свою собственную компиляцию. Напишите сценарий для предварительной обработки вашего кода R, который будет вручную заменять соответствующий литерал для каждого появления ваших «постоянных» переменных.

(Оригинал :) Какую выгоду вы надеетесь получить от наличия переменной, которая действует как C "const "?

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

Функция, которую вы ищете, может существовать,

3
ответ дан 27 November 2019 в 04:48
поделиться

Ответ ниже я взял с этого веб-сайта

Простейший вид выражения R - это просто постоянное значение, обычно числовое значение (число) или символьное значение (a кусок текста). Например, если нам нужно указать количество секунд, соответствующее 10 минутам, мы указываем число.

> 600
[1] 600

Если нам нужно указать имя файла, из которого мы хотим читать данные, мы указываем имя как символьное значение. Значения символов должны быть заключены в двойные или одинарные кавычки.

> "http://www.census.gov/ipc/www/popclockworld.html"
[1] "http://www.census.gov/ipc/www/popclockworld.html"
-2
ответ дан 27 November 2019 в 04:48
поделиться

Я почти уверен, что это невозможно в R. Если вы беспокоитесь о случайной перезаписи значения, то проще всего было бы поместить все ваши константы в структуру списка, тогда вы узнаете, когда используете эти значения. Что-то вроде:

my.consts<-list(pi=3.14159,e=2.718,c=3e8)

Затем, когда вам нужно получить к ним доступ, у вас есть памятные воспоминания, чтобы знать, чего не следует делать, а также выталкивает их из вашего обычного пространства имен.

Еще одно место, где можно спросить, - это список рассылки разработчиков R. Надеюсь, это поможет.

4
ответ дан 27 November 2019 в 04:48
поделиться

Поскольку вы планируете распространять свой код среди других, вы могли бы (должны?) Рассмотреть возможность создания пакета . Создайте в этом пакете NAMESPACE. Там вы можете определить переменные, которые будут иметь постоянное значение. По крайней мере, для функций, которые использует ваш пакет. Взгляните на Tierney (2003) Name Space Management for R

7
ответ дан 27 November 2019 в 04:48
поделиться

R не имеет функции языковых констант. Идея списка выше хороша; Я лично использую соглашение об именах, например ALL_CAPS.

1
ответ дан 27 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: