在 R 中声明一个常量变量

Posted

技术标签:

【中文标题】在 R 中声明一个常量变量【英文标题】:Declaring a Const Variable in R 【发布时间】:2010-10-30 12:30:23 【问题描述】:

我在 R 中工作,我想定义一些我(或我的一位合作者)无法更改的变量。在 C++ 中,我会这样做:

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

如何在 R 编程语言中做到这一点?

为清楚起见编辑:我知道我可以在 R 中定义这样的字符串:

path = "/projects/current"

我真正想要的是一种语言结构,它保证没有人可以更改与名为“path”的变量关联的值。

编辑以响应 cmets:

从技术上讲,const 是编译时保证,但在我看来,R 解释器会抛出停止执行并显示错误消息是有效的。例如,看看当您尝试为数值常量赋值时会发生什么:

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

所以我真正想要的是一种语言功能,它允许您一次且仅一次分配值,当您尝试为声明为 const 的变量分配新值时应该会出现某种错误。我不在乎错误是否发生在运行时,尤其是在没有编译阶段的情况下。根据***的定义,这在技术上可能不是 const ,但它非常接近。看起来这在 R 编程语言中也是不可能的。

【问题讨论】:

【参考方案1】:

lockBinding:

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

【讨论】:

你仍然可以做 rm(a);a 【参考方案2】:

由于您计划将您的代码分发给其他人,您可以(应该?)考虑创建一个包。在该包中创建一个 NAMESPACE。在那里您可以定义具有恒定值的变量。至少对于您的包使用的功能。看看Tierney (2003) Name Space Management for R

【讨论】:

【参考方案3】:

我很确定这在 R 中是不可能的。如果您担心不小心重写该值,那么最简单的做法是将所有常量放入一个列表结构中,然后您就知道了当您使用这些值时。比如:

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

然后,当您需要访问它们时,您有一个助手回忆录来知道不该做什么,并且它会将它们推出您的正常命名空间。

另一个要问的地方是 R 开发邮件列表。希望这会有所帮助。

【讨论】:

【参考方案4】:

(为新想法编辑:)bindenv 函数提供了一个

用于调整环境和环境中的绑定的实验界面。它们允许锁定环境以及单独的绑定,以及将变量链接到函数。

这似乎会给人一种错误的安全感(例如指向非const 变量的const 指针),但它可能会有所帮助。

(为重点编辑:)const 是compile-time guarantee,而不是锁定内存中的位。由于 R 没有一次查看所有代码的编译阶段(它是为交互式使用而构建的),因此无法检查未来的指令是否不会违反任何保证。如果有正确的方法可以做到这一点,R-help 列表中的人们会知道。我建议的解决方法:伪造你自己的编译。编写一个脚本来预处理您的 R 代码,该脚本将为您的“常量”变量的每次出现手动替换相应的文字。

(原文:)您希望从具有类似于 C“const”的变量中获得什么好处?

由于 R 仅具有 call-by-value semantics(除非您对环境进行了一些修改),因此没有任何理由担心通过调用变量来破坏变量。如果您担心您和您的合作者不小心使用了具有相同名称的变量,那么采用某种命名约定或使用某种 OOP 结构可能是正确的解决方案。

您正在寻找的功能可能存在,但我怀疑它源于 R 作为交互式环境,您希望能够撤消您的操作。

【讨论】:

我不担心调用函数会破坏变量,我只想保证环境中提供的某些变量永远不会改变。我基本上定义了一组分析工具,并且我定义了几个常量用于处理,它们在程序的执行过程中不应该改变。看起来这在 R 中可能很棘手/不可能。 只要这些“常量”有合理的名称,并且您的用户知道如果他们更改它们会发生坏事,那么您可以免除责任,并且专家用户可以在需要时更改它们。俗话说,“常量不,变量不”。【参考方案5】:

R 没有语言常量特性。上面的列表想法很好;我个人使用 ALL_CAPS 之类的命名约定。

【讨论】:

【参考方案6】:

我从this website得到下面的答案

最简单的 R 表达式只是一个常量值,通常是数值(数字)或字符值(一段文本)。例如,如果我们需要指定对应于 10 分钟的秒数,我们指定一个数字。

> 600
[1] 600

如果我们需要指定要从中读取数据的文件的名称,我们将名称指定为字符值。字符值必须用双引号或单引号括起来。

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

【讨论】:

您将常量与分配后无法更改的变量混淆了。 @David Locke - 好点。我试图在问题中澄清这一点。

以上是关于在 R 中声明一个常量变量的主要内容,如果未能解决你的问题,请参考以下文章

菜鸟笔记二常量和变量

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:常量的初始化定义

Java编程中如何区分常量和变量?

Salesforce基础 - Apex常量

修饰符 static 只允许在常量变量声明中

智能感知先前声明的变量和常量