Подтвердить что ты не робот

Объявление переменной Const в R

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

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

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

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

path = "/projects/current"

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

Изменить ответ на комментарии:

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

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

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

4b9b3361

Ответ 1

См. lockBinding:

a <- 1
lockBinding("a", globalenv())
a <- 2
Error: cannot change value of locked binding for 'a'

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

> 600
[1] 600

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

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