在 R 中声明 Const 变量

问题描述 投票:0回答:6

我正在使用 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

所以我真正想要的是一种语言功能,允许您一次且仅一次分配值,并且当您尝试将新值分配给声明为 const 的变量时,应该会出现某种错误。我不在乎错误是否发生在运行时,特别是如果没有编译阶段。从技术上讲,这可能不是维基百科定义的 const,但它非常接近。看起来这在 R 编程语言中也是不可能的。

r statistics constants
6个回答
53
投票

参见

lockBinding

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

10
投票

既然您计划将代码分发给其他人,您可以(应该?)考虑创建一个包。在该包中创建一个命名空间。您可以在那里定义具有常量值的变量。至少到你的包使用的功能。查看 Tierney (2003) R 的名称空间管理


4
投票

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

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

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

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


3
投票

(为新想法编辑:)

bindenv
函数提供了一个

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

这似乎是一种可能给人一种错误的安全感的东西(就像指向非

const
变量的
const
指针),但它可能会有所帮助。

(针对焦点编辑:)

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

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

由于 R 具有专有的 按值调用语义 (除非你对环境进行一些修改),所以没有任何理由担心通过调用函数来破坏你的变量。如果您担心您和您的协作者不小心使用同名的变量,那么采用某种命名约定或使用某种 OOP 结构可能是正确的解决方案。

您正在寻找的功能可能存在,但我对此表示怀疑,因为 R 最初是一个交互式环境,您希望能够在其中撤消您的操作。


1
投票

R 没有语言常量功能。上面的列表想法很好;我个人使用像 ALL_CAPS 这样的命名约定。


-4
投票

我从这个网站

获取了以下答案

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

> 600
[1] 600

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

> "http://www.census.gov/ipc/www/popclockworld.html"
[1] "http://www.census.gov/ipc/www/popclockworld.html"
© www.soinside.com 2019 - 2024. All rights reserved.