在 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 中声明一个常量变量的主要内容,如果未能解决你的问题,请参考以下文章