Объявление константной переменной в R - PullRequest
36 голосов
/ 02 июня 2009

Я работаю в R, и я хотел бы определить некоторые переменные, которые я (или один из моих соавторов) не могу изменить. В C ++ я бы сделал это:

const std::string path( "/projects/current" );

Как мне это сделать на языке программирования R?

Правка для ясности: я знаю, что могу определять строки в R:

path = "/projects/current"

Что мне действительно нужно, так это языковая конструкция, которая гарантирует, что никто никогда не сможет изменить значение, связанное с переменной с именем «path».

Изменить, чтобы ответить на комментарии:

Технически верно, что const является гарантией времени компиляции, но, на мой взгляд, было бы правильно, чтобы интерпретатор R бросил выполнение остановки с сообщением об ошибке. Например, посмотрите, что происходит, когда вы пытаетесь присвоить значения числовой константе:

> 7 = 3
Error in 7 = 3 : invalid (do_set) left-hand side to assignment

Итак, что мне действительно нужно, так это языковая функция, которая позволяет вам присваивать значения один раз и только один раз, и при попытке назначить новое значение переменной d, объявленной как const, должна быть какая-то ошибка. Мне все равно, если ошибка возникает во время выполнения, особенно если нет фазы компиляции. Это не может быть технически постоянным по определению Википедии, но это очень близко. Похоже, что это невозможно в языке программирования R.

Ответы [ 6 ]

43 голосов
/ 16 сентября 2009

См. lockBinding:

a <- 1
lockBinding("a", globalenv())
a <- 2
Error: cannot change value of locked binding for 'a'
6 голосов
/ 22 июля 2009

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

4 голосов
/ 02 июня 2009

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

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

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

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

3 голосов
/ 02 июня 2009

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

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

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

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

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

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

Функция, которую вы ищете, может существовать, но я сомневаюсь, что она является источником R как интерактивной среды, в которой вы захотите отменить свои действия.

1 голос
/ 22 июля 2009

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

0 голосов
/ 02 июня 2009

Я взял ответ ниже с этого сайта

Самым простым видом выражения R является просто константное значение, обычно числовое значение (число) или символьное значение (фрагмент текста). Например, если нам нужно указать количество секунд, соответствующее 10 минутам, мы указываем число.

> 600
[1] 600

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

> "http://www.census.gov/ipc/www/popclockworld.html"
[1] "http://www.census.gov/ipc/www/popclockworld.html"
...